zoukankan      html  css  js  c++  java
  • 怎样从Java转换到Kotlin代码:现在就开始使用Kotlin(KAD 29)

    作者:Antonio Leiva

    时间:Jul, 4, 2017

    原文链接:https://antonioleiva.com/kotlin-from-java/

    Kotlin最神奇特性之一是它能与Java完全集成。这就是说尽管你的应用程序的所有代码都是用Java编写的,而你仍然可以在Kotlin中创建一个类,从Java中使用它,且不会出现任何问题。

    这有两个好处:

    • 你可以在Java项目中使用Kotlin:在任何已经启动的项目中,你可以现在开始用Kotlin编写新的代码。然后从Java代码中调用它。

    • 如果你对Kotlin还心有余悸,可以在Java中做这个部分:很多人问我在Android上的某些情况下,Kotlin是否有不足。理论上,所有事情都能够胜任,但实际上,还无法知道(目前,还没有人用Kotlin在Android上完成“所有事情”)。事实是,这无关紧要,如果有些操作不能在Kotlin中完成,还可以回Java中去实现它。

    今天我们将看看这种兼容性是如何工作的,以及怎样从Java使用Kotlin代码。

    软件包级别的函数

    Kotlin中,函数不需要在类中,但Java不是的。那么我们如何调用函数呢?试想一下,我们有一个文件utils.kt,如下所示:

    1 fun logD(message: String) {
    2     Log.d("", message)
    3 }
    4 
    5 fun logE(message: String) {
    6     Log.e("", message)
    7 }

    Java中,我们可以通过UtilsKt类来访问它们,并使用一些静态方法:

    1 UtilsKt.logD("Debug");
    2 UtilsKt.logE("Error");

    在之前的文章,你已经看到我喜欢扩展函数。而在Java中,它们如何做?如我们有以下:

    1 fun ViewGroup.inflate(resId: Int, attachToRoot: Boolean = false): View {
    2     return LayoutInflater.from(context).inflate(resId, this, attachToRoot)
    3 }

    注意:

    虽然它们可能在某个时候出现,但我还没有明确地对此进行讲解。函数的自变量可能有默认值。这就是说,如果我们不特别指明,它们就使用在声明时指定的值。如我们要在Java中使用,这就阻止我们使用方法重载。

    该函数用于ViewGroup。它收到一个布局,并在其父视图使其膨胀。

    如果我们要在Java中使用它,会得到什么?

    1 View v = UtilsKt.inflate(parent, R.layout.view_item, false);

    如你所见,应用此函数的对象(接收方)是作为参数添加到函数中。另外,由于在Java中我们不能使用默认值,可选择参数是强制性的。

    如果要在Java中生成相应的重载,你可以为该函数使用@JvmOverloads注释。这样,你不需要在Java中指定false

    1 @JvmOverloads
    2 fun ViewGroup.inflate(resId: Int, attachToRoot: Boolean = false): View {
    3     return LayoutInflater.from(context).inflate(resId, this, attachToRoot)
    4 }
    1 View v = UtilsKt.inflate(parent, R.layout.view_item);

    如果你希望在Java中使用时指定类名称,则可以使用注释来修改它。在文件utils.kt中,添加在package之前:

    1 @file:JvmName("AndroidUtils")

    现在Java中的类将被命名:

    1 AndroidUtils.logD("Debug");
    2 AndroidUtils.logE("Error");
    3 View v = AndroidUtils.inflate(parent, R.layout.view_item, false);

    实例和静态字段

    Java中,我们使用字段来存储状态。它们可以是实例字段,这意味着每个对象都有自己的,或静态的(所有类的实例都将共享它们)。

    如果我们尝试在Kotlin中找到对应的,那么它将是属性和伴随对象。如果我们有这样一个类:

     1 class App : Application() {
     2 
     3     val appHelper = AppHelper()
     4 
     5     companion object {
     6         lateinit var instance: App
     7     }
     8 
     9     override fun onCreate() {
    10         super.onCreate()
    11         instance = this
    12     }
    13 
    14 }

    这在Java中是如何工作?您可以简单地访问作为静态字段的伴随对象,以及使用gettersetter的属性:

    1 AppHelper helper = App.instance.getAppHelper();

    你会编译没有问题。作为val,它只生成Java中的getter如果是var,我们也会有一个setter

    因为它使用了lateinit注释,访问instance已经自动工作,它会自动公开Kotlin用于存储状态的字段。但是假设我们创建一个常数:

    1 companion object {
    2     lateinit var instance: App
    3     val CONSTANT = 27
    4 }

    你会看到你不能直接访问它。你必须通过Companion内部类访问:

    1 KotlinTest.Companion.getCONSTANT()

    谁更好?要在Java中以同样的方式暴露出一个静态字段的方式,你需要一个新的注释:

    1 @JvmField val CONSTANT = 27

    现在可以使用Java代码:

    1 int c = App.CONSTANT;

    如果你在伴随对象中有函数,则可以使用@JvmStatic注释将其转换为静态方法。

    结论

    你看到了由Java使用Kotlin代码非常简单。在这里我已经展示了一些最典型的事例,其他都可以以非常相似的方式实现。

    我希望如果你有任何疑问,这能够说服你开始在项目中使用Kotlin如果你要认真思考,我建议你阅读这组Kotlin文章,你可以在这里了解更多关于Kotlin的信息。

  • 相关阅读:
    xx
    java
    SAFe 4.0参考指南:精益软件与系统工程的规模化敏捷框架
    Scaled Agile Framework – SAFe for Lean Enterprises
    云宏信息科技股份有限公司
    k8s~kubectl常用命令
    springboot~mvn多个关联项目打包问题
    java~线程池的总结~续
    java~线程池的总结
    电子工程师必备:九大系统电路识图宝典
  • 原文地址:https://www.cnblogs.com/figozhg/p/7137882.html
Copyright © 2011-2022 走看看