Kotlin 具有名称和序号构造函数的枚举类

Kotlin 具有名称和序号构造函数的枚举类,kotlin,enums,Kotlin,Enums,来自java背景,我想知道如何处理带有字符串名和整数序号的枚举 我注意到属性名和序号是内置在枚举中的,因为我试图指定构造函数,但它给出了阴影警告。这是我的密码 enum class Department { ACCOUNTING(0, "Accounting"), SALES(1, "Sales"), HR(2, "Human Resource") } 与kotlin中的类相同,可以在枚举类构造函数中指定属性。比如说 enum class Color( val r: I

来自java背景,我想知道如何处理带有字符串名和整数序号的枚举

我注意到属性名和序号是内置在枚举中的,因为我试图指定构造函数,但它给出了阴影警告。这是我的密码

enum class Department {
    ACCOUNTING(0, "Accounting"),
    SALES(1, "Sales"),
    HR(2, "Human Resource")
}
与kotlin中的类相同,可以在枚举类构造函数中指定属性。比如说

enum class Color( val r: Int, val g: Int, val b: Int){ 
     RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0); 
}
正如您已经知道的那样,所有枚举类的公共基类都内置了名称和序号属性。这些属性定义如下

/** Returns the name of this enum constant, exactly as declared in its enum declaration. */
public final val name: String

/** Returns the ordinal of this enumeration constant (its position in its enum declaration, 
 *  where the initial constant is assigned an ordinal of zero). */
public final val ordinal: Int
请注意,它们被标记为final,这意味着您不能覆盖它们。 因此,我建议您不要试图更改类定义的这些属性的值,而应该在枚举中声明自己的属性并使用它们的值。

与kotlin中的类相同,您可以在枚举类构造函数中指定属性。比如说

enum class Color( val r: Int, val g: Int, val b: Int){ 
     RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0); 
}
正如您已经知道的那样,所有枚举类的公共基类都内置了名称和序号属性。这些属性定义如下

/** Returns the name of this enum constant, exactly as declared in its enum declaration. */
public final val name: String

/** Returns the ordinal of this enumeration constant (its position in its enum declaration, 
 *  where the initial constant is assigned an ordinal of zero). */
public final val ordinal: Int
请注意,它们被标记为final,这意味着您不能覆盖它们。 因此,我建议您不要试图更改类定义的这些属性的值,而应该在枚举中声明自己的属性并使用它们的值。

在页面底部:

每个枚举常量都有属性来获取其名称和在枚举类声明中的位置

在您的示例中,这意味着您可以将枚举指定为:

enum class Department {
    ACCOUNTING,
    SALES,
    HR
}
然后

将打印

0: ACCOUNTING
1: SALES
2: HR
要向类添加显示名称(如人力资源),我认为最好的选择是向构造函数添加属性:

enum class Department(val displayName: String) {
    ACCOUNTING("Accounting"),
    SALES("Sales"),
    HR("Human Resources")
}
但是,如果您真的想坚持使用这种简短形式,只需相应地更改名称即可:

enum class Department {
    Accounting,
    Sales,
    `Human Resources`
}
请注意背面的记号,以便在显示名称中留出空格。我个人不会这样做,因为“人力资源部”打字很麻烦,而且至少在我看来有点难读

从页面底部开始:

每个枚举常量都有属性来获取其名称和在枚举类声明中的位置

在您的示例中,这意味着您可以将枚举指定为:

enum class Department {
    ACCOUNTING,
    SALES,
    HR
}
然后

将打印

0: ACCOUNTING
1: SALES
2: HR
要向类添加显示名称(如人力资源),我认为最好的选择是向构造函数添加属性:

enum class Department(val displayName: String) {
    ACCOUNTING("Accounting"),
    SALES("Sales"),
    HR("Human Resources")
}
但是,如果您真的想坚持使用这种简短形式,只需相应地更改名称即可:

enum class Department {
    Accounting,
    Sales,
    `Human Resources`
}
请注意背面的记号,以便在显示名称中留出空格。我个人不会这样做,因为“人力资源部”打字很麻烦,而且至少在我看来有点难读

您可以覆盖要为其返回不同值的特定枚举类HR的toString。您还可以为父枚举重写toString,并使其返回仅首字母大写的字符串,这样您就可以保持命名约定不变

enum class Department {
    ACCOUNTING,
    SALES,
    HR {
        override fun toString() = "Human Resource"
    };

// capitalize first letter
override fun toString() =
    super.toString().toLowerCase().capitalize()
}
然后,您可以简单地调用toString或将其作为string传递

fun main() {
   val hrString = HR.toString()
   println(hrString) // Human Resource
   println(HR) // Human Resource
   println(ACCOUNTING) // Accounting
   println(SALES) //Sales
}
您可以覆盖要为其返回不同值的特定枚举类HR的toString。您还可以为父枚举重写toString,并使其返回仅首字母大写的字符串,这样您就可以保持命名约定不变

enum class Department {
    ACCOUNTING,
    SALES,
    HR {
        override fun toString() = "Human Resource"
    };

// capitalize first letter
override fun toString() =
    super.toString().toLowerCase().capitalize()
}
然后,您可以简单地调用toString或将其作为string传递

fun main() {
   val hrString = HR.toString()
   println(hrString) // Human Resource
   println(HR) // Human Resource
   println(ACCOUNTING) // Accounting
   println(SALES) //Sales
}

所以我可以覆盖枚举中现有的name和ordinal属性,这很好,我想应该有一些方法可以利用一些内置功能而不指定构造函数。枚举类实际上有ordinal和name属性,但是你不能在构造函数中传递它们。Name是常量的名称,ordinal是常量在枚举中的位置。我将更新答案。@AppDeveloper Kotlin中枚举的名称和序号的处理方式与Java中相同。常量名称是名称,声明顺序决定序号。Slwa,同意,在Java中,我必须提供名称和序号作为属性,没有内置的AFAIK,在kotlin中,我注意到它是内置的,可以使用,但随后提供构造函数和隐藏继承的属性让我很不舒服。@AppDeveloper Java枚举也有内置的名称和序号getter,就像在kotlin中一样。它们是最终的,就像在Kotlin中一样。所以我可以覆盖enum中现有的name和ordinal属性,我想应该有一些方法来利用一些内置功能,而不指定构造函数。enum类实际上有ordinal和name属性,但你不能在构造函数中传递它们。Name是常量的名称,ordinal是常量在枚举中的位置。我将更新答案。@AppDeveloper Kotlin中枚举的名称和序号的处理方式与Java中相同。常量名称是名称,声明顺序决定序号。Slwa,同意,在Java中,我必须提供名称和序号作为属性
y、 没有内置的AFAIK,在kotlin中,我注意到它是内置的,可以使用,但是提供构造函数和隐藏继承属性让我很不舒服。@AppDeveloper Java枚举也有内置的名称和序号getter,就像在kotlin中一样。它们是最终的,就像在Kotlin中一样。我想知道您是否可以指定一个用户友好的字符串,例如ACCOUNTING->ACCOUNTING,HR->Human Resources,同时保持缩写形式不变,这就是利用现有名称属性ideas背后的想法?就我个人而言,我会在构造函数中添加属性displayName或其他内容。但是,如果您真的想坚持使用这种简短的形式,您可以相应地命名您的元素,但是这可能会使阅读变得不清楚,并且键入起来很麻烦。我将在我的答案中编辑一个示例。在Kotlin:@Tenfour04中使用仅大写的枚举名并不被视为惯例,谢谢您的更正!应该已经检查过了。只是想知道您是否可以指定一个用户友好的字符串,例如ACCOUNTING->ACCOUNTING,HR->Human Resources,同时保持缩写形式不变,这就是利用现有名称属性ideas背后的想法?就我个人而言,我会在构造函数中添加属性displayName或其他内容。但是,如果您真的想坚持使用这种简短的形式,您可以相应地命名您的元素,但是这可能会使阅读变得不清楚,并且键入起来很麻烦。我将在我的答案中编辑一个示例。在Kotlin:@Tenfour04中使用仅大写的枚举名并不被视为惯例,谢谢您的更正!应该已经检查过了。你确定上面的代码编译时带有警告吗?你确定上面的代码编译时带有警告吗?