关于java:创建字符串枚举的最佳方法?

Best way to create enum of strings?

使用enum类型表示一组字符串的最佳方法是什么?

我试过这个:

1
2
3
enum Strings{
   STRING_ONE("ONE"), STRING_TWO("TWO")
}

那么,我怎样才能将它们用作Strings


我不知道您想做什么,但这是我实际翻译示例代码的方法……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
 *
 */

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创建getter方法。

你现在可以做Strings.STRING_ONE.toString();


枚举的自定义字符串值

来自http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html

JavaEnUM的默认字符串值是其面值或元素名。但是,可以通过重写toString()方法自定义字符串值。例如,

1
2
3
4
5
6
7
8
9
10
11
12
13
public enum MyType {
  ONE {
      public String toString() {
          return"this is one";
      }
  },

  TWO {
      public String toString() {
          return"this is two";
      }
  }
}

运行以下测试代码将产生此结果:

1
2
3
4
5
6
7
8
9
10
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


使用其name()方法:

1
2
3
4
5
6
7
8
9
public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(Strings.ONE.name());
    }
}

enum Strings {
    ONE, TWO, THREE
}

生成ONE


要么将枚举名称设置为与所需的字符串相同,要么更一般地说,可以将任意属性与枚举值相关联:

1
2
3
4
5
6
7
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.
}

将常量放在顶部,方法/属性放在底部是很重要的。


根据您所说的"将它们用作字符串"的含义,您可能不希望在此处使用枚举。在大多数情况下,精英绅士提出的解决方案将允许您通过他们的ToString方法来使用它们,例如在System.out.println(STRING_ONE)String s ="Hello"+STRING_TWO中,但是当您确实需要字符串(例如STRING_ONE.toLowerCase()时,您可能更喜欢将它们定义为常量:

1
2
3
4
public interface Strings{
  public static final String STRING_ONE ="ONE";
  public static final String STRING_TWO ="TWO";      
}


可以将其用于字符串枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
    }
}

从主方法调用

1
2
3
4
5
6
public class Test {
    public static void main (String args[]){
        System.out.println(EnumTest.NAME_ONE.getName());
        System.out.println(EnumTest.NAME_TWO.getName());
    }
}


如果不想使用构造函数,并且想为该方法指定一个特殊的名称,请尝试以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public enum MyType {
  ONE {
      public String getDescription() {
          return"this is one";
      }
  },    
  TWO {
      public String getDescription() {
          return"this is two";
      }
  };

  public abstract String getDescription();
}

我怀疑这是最快的解决办法。不需要使用变量final。