Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用枚举或静态字符串变量_Java - Fatal编程技术网

在java中使用枚举或静态字符串变量

在java中使用枚举或静态字符串变量,java,Java,有一个问题围绕着哪一个更好地使用。Java5枚举或静态字符串 我总是以字符串的形式获取数据 那么比如说, 私有静态最终字符串加载\u druges=“加载药物” 或者使用Java5枚举 public enum LoadType { LOAD_DRUGS("load drugs"); } 在我的代码中,我总是收到“加载药物”类型的字符串。我使用if-else语句来查看基于它接下来要做什么。但是我倾向于使用java5枚举和use switch case,但是我总是需要根据我得到的字符串值来获取枚举

有一个问题围绕着哪一个更好地使用。Java5枚举或静态字符串

我总是以字符串的形式获取数据

那么比如说,

私有静态最终字符串加载\u druges=“加载药物”

或者使用Java5枚举

public enum LoadType
{
LOAD_DRUGS("load drugs");
}
在我的代码中,我总是收到“加载药物”类型的字符串。我使用if-else语句来查看基于它接下来要做什么。但是我倾向于使用java5枚举和use switch case,但是我总是需要根据我得到的字符串值来获取枚举

那么什么是正反两面的呢


谢谢

您可以尝试将字符串转换为枚举的简单替换

switch(MyEnum.valueOf(text.replace(' ', '_')) {
    case load_strings:
如果需要大写,可以使用toUpperCase()


您应该做您认为最简单、最清晰的事情。

因为enum是类型化的

未键入静态字符串

public enum Something{
  CAT("cat");

  private String animal;

  private Something(String animal){
    this.animal = animal;
  }

  public String getAnimal(){
    return this.animal;
  }
}

通常,您应该使用枚举来存储一组以某种方式相关的值。他们都应该有相似的“是一个”关系。它不应该仅仅用于存储一组不相关的常量字符串

当然,如果在一组字符串值上有一个switch语句,则表明这些字符串值是相关的,应该分组为一个Enum,并使用Enum的机制来使用开关


如果传递的字符串等于名称值,则枚举类型的valueOf方法将允许您从字符串转换为枚举类型。如果不是这样,您可以实现自己的valueOf,它使用存储的字符串字段而不是名称。您可以将字段存储在私有静态映射中进行转换。

这个答案可能有些过分。也许会有一个徽章。无论如何,如果您有很多枚举值,并且必须将字符串作为另一个系统向您发送信息的手段来处理,那么它可能会很有用。这正是我所拥有的(50以北),所以我使用了这个构造,这样我就可以只生成一次db报告的字符串和我内部使用的枚举的映射,之后就不再考虑它了--toString和fromString完成所有工作:

package com.stevej;

import com.google.common.collect.HashBiMap;

public enum TestEnum {
  ALPHA("Alpha"), BETA("Beta"), GAMMA("Gamma");

  private static HashBiMap<TestEnum, String> stringMapping = HashBiMap
      .create(TestEnum.values().length);

  private String stringValue = null;

  TestEnum(String stringValue) {
    this.stringValue = stringValue;
  }

  String getStringValue() {
    return this.stringValue;
  }

  @Override
  public String toString() {
    return stringMapping.get(this);
  }

  public static TestEnum fromString(String string) {
    return stringMapping.inverse().get(string);
  }

  static {
    for (TestEnum e : TestEnum.values()) {
      stringMapping.put(e, e.getStringValue());
    }
  }
}
输出显示混合大小写值的使用,而不是大写,显示正在使用的字符串:

>>α
>>β
>>伽马
>>α
>>β
>>伽马


请注意,我使用的是Google Guava库,因此我可以利用BiMap。

您的代码总是尝试加载药物。。我同意,Hummyu可能想读这篇@claymore1977。我不是说这是个好主意,但你可以做到我不是在问从字符串到枚举的转换方法。我只是想知道使用这些方法的利弊。谢谢@Rishi,如果是那样的话,我会说这在你的例子中没有多大关系。如果将
enum
用作对象而不是字符串列表,则会产生更大的差异。我看到的问题是维护和灵活性方面的问题。从维护的角度来看,这个text.replace()必须到处出现。如果模式发生了变化,那么就需要修改大量代码。它假设相同的模式适用于每个枚举。这可能不够灵活。我想要一个将枚举值与任意字符串匹配的解决方案,唯一的限制是字符串在枚举值之间必须是唯一的。通过这种方式,我将传递字符串的服务与解释字符串的代码分离。@Steve J,那么您如何在不添加方法调用的情况下处理字符串中的空格呢?从类型安全性的角度来看,使用switch/case的枚举比使用if/else的字符串能确保更高的性能吗。我知道if/else和switch/case在性能上是如何考虑的,但从这个上下文来看。我看到JohnB是沿着这些思路提出建议的。由于
Map
只在一个方向上导航,一个简单的、标准的
HashMap
也会很好地完成。在静态方法fromString()中,Map的用法相反。此外,BiMap还强制执行字符串必须与枚举值一样唯一的规则。抱歉,不够清楚:由于映射仅在一个方向(反向)上使用,因此可以使用简单的
HashMap
并在静态初始值设定项中构造该反向映射。实际上不允许重复字符串。由于编译器将检查
TestEnum
端是否有DUP,因此BiMap也没有这一点。除此之外,我还看到了许多
enum
定义,并为自己创建了它们。但我使用前向映射进行toString操作。也许我错过了什么。基本上,我希望在两个方向上覆盖StringEnum。枚举值的字符串表示形式是唯一出现的。
package com.stevej;

public class StackOverflowMain {

  public static void main(String[] args) {
    System.out.println(">> " + TestEnum.ALPHA);
    System.out.println(">> " + TestEnum.BETA);
    System.out.println(">> " + TestEnum.GAMMA);

    TestEnum a = TestEnum.fromString("Alpha");
    TestEnum b = TestEnum.fromString("Beta");
    TestEnum c = TestEnum.fromString("Gamma");

    System.out.println(">> " + a);
    System.out.println(">> " + b);
    System.out.println(">> " + c);
  }

}