Enum класс с именем и порядковыми конструкторами - PullRequest
1 голос
/ 03 марта 2020

Исходя из java фона, мне интересно, как вы обрабатываете Enums с именами строк и порядковыми номерами int.

Я заметил, что имя свойства и порядковый номер встроены в перечисления, как я пытался указать конструктор, и это дало теневое предупреждение. Вот мой код.

enum class Department {
    ACCOUNTING(0, "Accounting"),
    SALES(1, "Sales"),
    HR(2, "Human Resource")
}

Ответы [ 3 ]

3 голосов
/ 03 марта 2020

Из документации (внизу страницы):

Каждая константа перечисления имеет свойства для получения своего имени и позиции в объявлении класса перечисления.

В вашем примере это означает, что вы можете указать свое перечисление как:

enum class Department {
    ACCOUNTING,
    SALES,
    HR
}

Тогда

Department.values().forEach { println("${it.ordinal}: ${it.name}") }

напечатает

0: ACCOUNTING
1: SALES
2: HR


Чтобы добавить отображаемое имя (например, "Human Resources") в ваш класс, я думаю, что вам лучше всего добавить свойство в ваш конструктор:
enum class Department(val displayName: String) {
    ACCOUNTING("Accounting"),
    SALES("Sales"),
    HR("Human Resources")
}

Однако, если вы действительно хотите придерживаться этой краткой формы , вы можете просто изменить имя соответственно:

enum class Department {
    Accounting,
    Sales,
    `Human Resources`
}

Обратите внимание на обратные галочки, чтобы учесть пробелы в вашем отображаемом имени. Лично я бы не стал этого делать, поскольку Department.`Human Resources` громоздко набирать и его трудно читать (по крайней мере, на мой взгляд).

2 голосов
/ 03 марта 2020

Вы можете переопределить toString() для указанного класса c enum (HR), для которого вы хотите вернуть другое значение. Вы также можете переопределить toString() для своего родителя enum и сделать так, чтобы он возвращал String только с первой заглавной буквой, таким образом вы можете сохранить соглашение об именах без изменений.

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

// capitalize first letter
override fun toString() =
    super.toString().toLowerCase().capitalize()
}

затем вы можете просто позвоните toString() или передайте его как строку.

fun main() {
   val hrString = HR.toString()
   println(hrString) // Human Resource
   println(HR) // Human Resource
   println(ACCOUNTING) // Accounting
   println(SALES) //Sales
}
1 голос
/ 03 марта 2020

То же, что и class в kotlin, вы можете указать свойства в enum class constructor. Например,

enum class Color( val r: Int, val g: Int, val b: Int){ 
     RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0); 
}

Как вы уже знаете, Enum class ( Общий базовый класс всех перечислимых классов ) имеет встроенную name и ordinal свойства. эти свойства определены следующим образом

/** 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, то есть вы не можете override их. Поэтому я предлагаю вместо попытки изменить значения этих свойств, как определено в class, вы должны объявить свои собственные свойства в enum и использовать вместо них их значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...