Каков наилучший способ, чтобы тип enum
представлял собой набор строк?Лучший способ создать перечисление строк?
Я попытался это:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
Как можно затем использовать их в качестве Strings
?
Каков наилучший способ, чтобы тип enum
представлял собой набор строк?Лучший способ создать перечисление строк?
Я попытался это:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
Как можно затем использовать их в качестве Strings
?
Я не знаю, что вы хотите сделать, но это, как я на самом деле перевел свой пример кода ....
/**
*
*/
package test;
/**
* @author The Elite Gentleman
*
*/
public enum Strings {
STRING_ONE("ONE"),
STRING_TWO("TWO")
;
private final String text;
/**
* @param text
*/
Strings(final String text) {
this.text = text;
}
/* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
@Override
public String toString() {
return text;
}
}
В качестве альтернативы, вы можете создать метод получения для text
.
Теперь вы можете сделать Strings.STRING_ONE.toString();
Используйте свой name()
метод:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
дающий ONE
.
Да, но 'Strings.STRING_ONE.name () 'дает значение" STRING_ONE ", а не" ONE ". Это просто не очень хороший ответ. У вас не может быть ни одной строки, которая не была бы допустимым идентификатором Java и т. Д. –
@Mark, true, он не может обрабатывать символ. Если OP просто хочет один символ, это решение более прямолинейно, чем предложение Elite Gentleman. Но действительно: если диапазон символов превышает те, которые может иметь действительный Java-идентификатор, это не-go. Хорошая точка зрения. –
Очень разумно иметь внутреннее соглашение об именах для перечисления, которое отличается от того, что хотелось бы показать с помощью toString() (особенно если пользователь видит выход), поэтому я не думаю, что это совсем то, что OP искал. –
Либо установить имя перечислимого быть таким же, как строка, которую вы хотите или, в более общем случае, вы можете связать произвольные атрибуты с значениями перечислений:
enum Strings {
STRING_ONE("ONE"), STRING_TWO("TWO");
private final String stringValue;
Strings(final String s) { stringValue = s; }
public String toString() { return stringValue; }
// further methods, attributes, etc.
}
Это важно иметь константы в верхней части и методы/атрибуты внизу.
А также иметь ** частный ** конструктор. –
Конструкторы enum являются закрытыми по умолчанию и не требуют модификатора доступа. Но это хороший момент в отношении модификаторов доступа в целом, я обновил свой код, чтобы добавить их в атрибут и accessor. –
В зависимости от того, что вы подразумеваете под «использовать их как строки», вы можете не использовать перечисление здесь. В большинстве случаев решение, предложенное The Elite Gentleman, позволит вам использовать их через свои методы toString, например. в System.out.println(STRING_ONE)
или String s = "Hello "+STRING_TWO
, но когда вам действительно нужно Strings (например STRING_ONE.toLowerCase()
), вы можете предпочесть их определение как константы:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
На самом деле это то, чего я пытаюсь избежать ...! – Dori
На самом деле, если они также хотят 'toLowerCase()' на моем решении, они могут пойти 'Strings.STRING_TWO.toString(). ToLowerCase()'. –
Конечно, но это не использует их как строки, как я ее интерпретировал. Поскольку Rrackham, похоже, не требует такого использования, он, конечно, должен использовать предлагаемое решение enum. – hd42
Пользовательские строковые значения для Enum
из http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
Значение по умолчанию Строковое значение для java enum - это его номинальная стоимость или имя элемента. Однако вы можете настроить строковое значение, переопределив метод toString(). Например,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
Запуск следующий код теста будет производить это:
public class EnumTest {
public static void main(String[] args) {
System.out.println(MyType.ONE);
System.out.println(MyType.TWO);
}
}
this is one
this is two
Это * не * эффективный способ сделать это. Это создает новый пользовательский класс для каждого значения в перечислении. В приведенном выше примере вы увидите следующее в каталоге 'bin': EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class, который добавит _real_ быстро. Лучше всего сделать это как ожидаемый ответ, передав значения конструктору перечисления. Я фактически не согласен с переопределением 'toString()'; Я считаю, что лучше использовать явный getter, такой как 'getKey()', поскольку переопределение 'toString()' может быть неожиданным другим пользователем перечисления. –
полностью согласен с @MattQuigley. Это побуждает пользователей использовать toString для вещей, для которых он не должен использоваться. Если вам нужен ярлык, вы бы скорее добавили атрибут метки –
. Кроме того, нет способа перейти в другую сторону (от строки до объекта перечисления), которая, вероятно, понадобится в какой-то момент. –
Если вы не хотите использовать конструкторы, и вы хотите иметь специальное название для метод, попробуйте это:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
I susp что это быстрое решение. Нет необходимости использовать переменные final.
, но с этим вам еще нужно вызвать getDescription(), из которого запрашивающий человек хочет позвонить ONE или получить доступ к нему как константу. –
Вы можете использовать это для строки Enum
public enum EnumTest {
NAME_ONE("Name 1"),
NAME_TWO("Name 2");
private final String name;
/**
* @param name
*/
private EnumTest(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
И звонить из основного метода
общественного класса Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
Я не знаю, является ли это требованием к компилятору, но 'private String text' должен быть окончательным. – Jonathan
@ Jonathan, nope, мой скомпилированный штраф .... –
@Jonathan, если бы это было окончательно, я думаю, что вы не смогли бы оценить ценность у конструктора. Могли бы вы? –