Kotlin用于android和静态最终内部类

时间:2016-07-27 21:06:20

标签: java android kotlin

我试图在Kotlin上重写我的Android应用程序,并且在转换ContentProvider合同类时我遇到了问题。 所以我有简单的合同类(内容类型和内容uris的默认内容被省略):

public final class Contract {
    public static final class Contacts {
        public static final String NAME = "Name"
        public static final String BIRTH = "Birth"
        public static final String IMAGE = "Image"
    }
}

如果我理解正确,在Kotlin我们没有静态成员。而不是这个,我们有"伴侣对象"。所以在将它转换为Kotlin之后,我有了这段代码:

object BirthdayContract {
    class Contacts : BaseColumns {
        companion object {
            val NAME = "Name"
            val BIRTH = "Birth"
            val IMAGE = "Image"
        }
    }
}

但是当我试图访问像Contract.Contacts.NAME这样的字段时,我有错误:" NAME有私人访问权限"。更改可见性修饰符不起作用。 那么有什么方法可以在Kotlin中使用这样的契约类,还是更好地将它保存在Java中?

UPD 我想我应该澄清一下 - 我的来电代码也在Kotlin中。 问题出在@JvmField注释中。有了它,我可以直接访问静态成员,而无需调用getter。

4 个答案:

答案 0 :(得分:6)

NAME是一个属性,默认情况下,其支持字段具有私有访问权限。但由于它是一个属性,因此它有一个吸气剂:getNAME()

由于这不是您如何自然地访问Java中的常量,因此有几种方法可以直接显示该字段:

  1. constconst val NAME = "Name"
  2. @JvmField注释:@JvmField val NAME = "Name"

答案 1 :(得分:2)

要将常量公开为字段,请使用@JvmField

对其进行注释
class Contacts  {
    companion object {
        @JvmField val NAME = "Name"
        @JvmField val BIRTH = "Birth"
        @JvmField val IMAGE = "Image"
    }
}

然后你可以像这样在Java中使用它们:

String name = Contacts.NAME;

一旦您的所有代码都在Kotlin中,您就可以删除@JvmField注释。

答案 2 :(得分:0)

考虑使用普通的对象

cbor_src = [
    os.path.join(cborDir,'src/cborparser.c'),
    os.path.join(cborDir,'src/cborencoder.c'),
    os.path.join(cborDir,'src/cborerrorstrings.c'),
    os.path.join(cborDir,'src/cborparser_dup_stirng.c'),
]

这应该完全填写您的初始Java代码。

在最新的稳定Kotlin版本中,公开是默认的可见性。

可选地,您可以为编译时常量添加 const 关键字,以便它们可用于注释:https://kotlinlang.org/docs/reference/properties.html#compile-time-constants

@JvmStatic 注释适用于Java-Interop,如果您计划使用完全kotlin,则不需要它。

答案 3 :(得分:0)

你可以用@JvmStatic

来做
object BirthdayContract {
    class Contacts : BaseColumns {
        companion object {
            @JvmStatic val NAME = "Name"
            @JvmStatic val BIRTH = "Birth"
            @JvmStatic val IMAGE = "Image"
        }
    }
}

//Java
BirthdayContract.Contacts.Companion.getNAME()

到目前为止,我认为没有充分理由扩展BaseColumns,因此更好的选择

object BirthdayContract {
    object Contacts  {
           const val NAME = "Name"
           const val BIRTH = "Birth"
           const val IMAGE = "Image"

    }
}
//Java
BirthdayContract.Contacts.NAME

底线是kotlin中的嵌套对象看起来不干净。 请考虑简化您的代码