首页 文章

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

提问于
浏览
6

我正在尝试在Kotlin上重写我的Android应用程序,并且在转换ContentProvider Contract 类时我遇到了问题 . 所以我有简单的 Contract 类(内容类型和内容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中使用这样的 Contract 类,或者更好地将它保存在Java中?

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

4 回答

  • 0

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

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

    • constconst val NAME = "Name"

    • @JvmField注释: @JvmField val NAME = "Name"

  • 6

    要将常量公开为字段,请使用 @JvmField 注释它们

    class Contacts  {
        companion object {
            @JvmField val NAME = "Name"
            @JvmField val BIRTH = "Birth"
            @JvmField val IMAGE = "Image"
        }
    }
    

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

    String name = Contacts.NAME;
    

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

  • 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中的嵌套对象看起来不干净 . 请考虑简化您的代码

  • 2

    考虑使用普通的 object

    object Contract {
        object Contacts {
            val NAME = "Name"
            val BIRTH = "Birth"
            val IMAGE = "Image"
        }
    }
    

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

    在最新的稳定Kotlin版本 public 是默认的可见性 .

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

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

相关问题