2010-10-20 5 views

ответ

483

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

/** 
* 
*/ 
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();

+3

Я не знаю, является ли это требованием к компилятору, но 'private String text' должен быть окончательным. – Jonathan

+1

@ Jonathan, nope, мой скомпилированный штраф .... –

+0

@Jonathan, если бы это было окончательно, я думаю, что вы не смогли бы оценить ценность у конструктора. Могли бы вы? –

55

Используйте свой name() метод:

public class Main { 
    public static void main(String[] args) throws Exception { 
     System.out.println(Strings.ONE.name()); 
    } 
} 

enum Strings { 
    ONE, TWO, THREE 
} 

дающий ONE.

+13

Да, но 'Strings.STRING_ONE.name () 'дает значение" STRING_ONE ", а не" ONE ". Это просто не очень хороший ответ. У вас не может быть ни одной строки, которая не была бы допустимым идентификатором Java и т. Д. –

+2

@Mark, true, он не может обрабатывать символ. Если OP просто хочет один символ, это решение более прямолинейно, чем предложение Elite Gentleman. Но действительно: если диапазон символов превышает те, которые может иметь действительный Java-идентификатор, это не-go. Хорошая точка зрения. –

+0

Очень разумно иметь внутреннее соглашение об именах для перечисления, которое отличается от того, что хотелось бы показать с помощью toString() (особенно если пользователь видит выход), поэтому я не думаю, что это совсем то, что OP искал. –

14

Либо установить имя перечислимого быть таким же, как строка, которую вы хотите или, в более общем случае, вы можете связать произвольные атрибуты с значениями перечислений:

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

Это важно иметь константы в верхней части и методы/атрибуты внизу.

+0

А также иметь ** частный ** конструктор. –

+1

Конструкторы enum являются закрытыми по умолчанию и не требуют модификатора доступа. Но это хороший момент в отношении модификаторов доступа в целом, я обновил свой код, чтобы добавить их в атрибут и accessor. –

13

В зависимости от того, что вы подразумеваете под «использовать их как строки», вы можете не использовать перечисление здесь. В большинстве случаев решение, предложенное 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";  
} 
+4

На самом деле это то, чего я пытаюсь избежать ...! – Dori

+0

На самом деле, если они также хотят 'toLowerCase()' на моем решении, они могут пойти 'Strings.STRING_TWO.toString(). ToLowerCase()'. –

+0

Конечно, но это не использует их как строки, как я ее интерпретировал. Поскольку Rrackham, похоже, не требует такого использования, он, конечно, должен использовать предлагаемое решение enum. – hd42

89

Пользовательские строковые значения для 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 
+15

Это * не * эффективный способ сделать это. Это создает новый пользовательский класс для каждого значения в перечислении. В приведенном выше примере вы увидите следующее в каталоге 'bin': EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class, который добавит _real_ быстро. Лучше всего сделать это как ожидаемый ответ, передав значения конструктору перечисления. Я фактически не согласен с переопределением 'toString()'; Я считаю, что лучше использовать явный getter, такой как 'getKey()', поскольку переопределение 'toString()' может быть неожиданным другим пользователем перечисления. –

+0

полностью согласен с @MattQuigley. Это побуждает пользователей использовать toString для вещей, для которых он не должен использоваться. Если вам нужен ярлык, вы бы скорее добавили атрибут метки –

+0

. Кроме того, нет способа перейти в другую сторону (от строки до объекта перечисления), которая, вероятно, понадобится в какой-то момент. –

2

Если вы не хотите использовать конструкторы, и вы хотите иметь специальное название для метод, попробуйте это:

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.

+0

, но с этим вам еще нужно вызвать getDescription(), из которого запрашивающий человек хочет позвонить ONE или получить доступ к нему как константу. –

2

Вы можете использовать это для строки 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()); 
} 

}

Смежные вопросы