【问题标题】:Equivalent of Java's 'public static final string'等效于 Java 的“公共静态最终字符串”
【发布时间】:2018-06-10 12:28:58
【问题描述】:

在我的 Java 项目中,我有一个类,我使用 public static final String 属性声明了许多项目常量:

public class Constants {
    public static final String KIND_NAME = "user";
    public static final String AVATAR_IMAGE_ID = "avatarImageId";
    public static final String AVATAR_IMAGE_URL = "avatarImageUrl";
    public static final String NAME_COLUMN = "name";
    public static final String TOTAL_SCORE_COLUMN = "totalScore";
    ...
}

所以我可以在项目的许多不同地方使用它:

...
String userName = user.getProperty(Constants.KIND_NAME);
...

到目前为止,我已经找到了一些在 Kotlin 中实现此功能的不同方法,例如:companion objectsdata class。 Kotlin 中最好的等效代码是什么?

【问题讨论】:

  • 我想模仿:public static final
  • 使用 object 来声明你的常量类。并将所有定义为 const val

标签: kotlin


【解决方案1】:

@Todd 的回答会产生一个 Constants 类的 INSTANCE 实例,这有时是出乎意料的。更好的选择是:

// file-level
@file:JvmName("Constants")
const val KIND_NAME = "user"
const val AVATAR_IMAGE_ID = "avatarImageId"
const val AVATAR_IMAGE_URL = "avatarImageUrl"
const val NAME_COLUMN = "name"
const val TOTAL_SCORE_COLUMN = "totalScore"

【讨论】:

    【解决方案2】:

    您可能希望使用简单的classcompaion object 和一些const vals:

    class Constants {
        companion object {
            const val KIND_NAME = "user"
            const val AVATAR_IMAGE_ID = "avatarImageId"
            const val AVATAR_IMAGE_URL = "avatarImageUrl"
            const val NAME_COLUMN = "name"
            const val TOTAL_SCORE_COLUMN = "totalScore"
        }
    }
    

    【讨论】:

    • 那些vals 应该是const,除非您希望它在Java 端看起来像Constants.Companion.getKIND_NAME()
    • 是的。我阅读了对象,如果您使用的是 java,那么它看起来像那样。
    • 反对者应该解释他们的推理,这种方法是完全有效的,这取决于Constants 的其他用法。
    • @ice1000 因为Constants 应该有一个private constructor 并且vals 应该是const
    猜你喜欢
    • 2016-08-24
    • 2015-06-04
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2011-03-17
    • 1970-01-01
    相关资源
    最近更新 更多