当前位置: 首页 > 知识库问答 >
问题:

科特林为Android和静态最终内部类

牟星火
2023-03-14

我正试图在Kotlin上重写我的android应用程序,在转换ContentProvider合同类时遇到了问题。所以我有一个简单的契约类(省略了内容类型和内容uri等默认内容):

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"
    }
}

如果我理解正确的话,在静态编程语言中,我们没有静态成员。相反,我们有“伴侣对象”。所以在将其转换为静态编程语言后,我有这样的代码:

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

但是当我试图访问像合同这样的字段时。联系人。姓名,我有错误:“姓名有私人访问”。更改可见性修改器没有任何效果。那么,在Kotlin中是否有某种方法可以使用这样的契约类,或者最好将其保留在Java中?

更新我认为我应该澄清-我的来电代码也在科特林。@JvmField注释中存在问题。有了它,我可以直接访问静态成员,而无需调用getter。

共有3个答案

裴金鑫
2023-03-14

您可以使用@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中的嵌套对象看起来不干净。请考虑简化您的代码

魏宸
2023-03-14

要将常量公开为字段,请使用@JvmField对其进行注释

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

然后,您可以像这样从Java中使用它们:

String name = Contacts.NAME;

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

淳于鹏
2023-03-14

< code>NAME是一个属性,默认情况下,它的后台字段具有私有访问权限。但是因为它是一个属性,所以有一个getter函数:< code>getNAME()。

因为这不是Java中自然访问常量的方式,所以有两种方法可以直接公开该字段:

    < li> 常量: 常量val NAME = "Name" < li> @JvmField批注:< code > @ JVM field val NAME = " NAME "
 类似资料:
  • 问题内容: 我找到了一个代码,它声明了如下代码 它们之间有什么区别或相同?还是与或不同? 问题答案: 完全没有区别。根据 Java语言规范的8.3.1-类-字段修饰符, 如果两个或多个(不同的)字段修饰符出现在字段声明中,则按惯例(尽管不是必需的),它们的出现顺序与上面FieldModifier生产中所示的顺序一致。 对于字段,所述生产按以下顺序列出修饰符: 对于方法:

  • 如何在使用Kotlin的Spring Boot中正确初始化ConfigurationProperties? 目前我喜欢下面的例子: 但是它看起来很丑陋,实际上不是一个iable,foo是常量ue,应该在启动期间初始化,将来不会改变。

  • 我们正在开发基于spring boot 2.5.6的支付应用程序。该应用程序托管在docker上,并在Java14上启动。我们创建了一个名为的抽象类,它是,包含两个变量和。所有枚举类都扩展了这个基类,并在其中定义常量。 这个决定是为了定制整个应用程序层中使用的枚举。你可以在下面看到一个例子: 该类在实体层中用作嵌入变量,如下所示: 系统工作得很好,但是发生了一些错误,ShapeEnum的字段。RE

  • 问题内容: 我已经在Google上进行了广泛的搜索,但均无济于事。我似乎无法将这个概念笼罩在脑海中。为什么本地班级会接受静态最终字段?如下面的以下示例: 在EnglishGoodbye课堂上,允许告别可变吗?为什么?我很困惑。为什么允许但没有静态变量?我知道为什么它不能访问封闭范围的成员,除非它们是一个编译器时间常数,因为当函数结束时这些变量不再存在,但类可能不存在。对?我只是对此感到困惑。 谢谢