Java返回正确的枚举类型

时间:2012-11-29 22:39:03

标签: java enums

如果我有以下

public enum MY_ENUM_THING
{
  NAME("JOE"),
  SOMETHING,
  ISWORKING(true);

  private String parameter;
  private boolean truth;

  MY_ENUM_THING()
  {

  }
  MY_ENUM_THING(String parameter)
  {
    this.parameter = parameter;
  }
  MY_ENUM_THING(boolean truth)
  {
    this.truth = truth
  }

  public ?? getEnumValue()
  {
     // this method (return) is what would be jamming me up
  } 
}

如果枚举的类型是什么,我怎样才能返回?

示例和期望的结果

System.out.print(MY_ENUM_THING.NAME.getEnumValue());
//JOE
System.out.print(MY_ENUM_THING.SOMETHING.getEnumValue());
//SOMETHING  <-- just return SOMETHING.name()
System.out.print(MY_ENUM_THING.ISWORKING.getEnumValue());
//true

4 个答案:

答案 0 :(得分:3)

你不能写这样的方法,每种情况都有不同的返回类型! (除非你返回Object,但这会很混乱。)事实上,我闻到了一个设计问题 - 每个枚举值都应该包含每个属性的值,为某些属性和值设置值是有问题的。不适合他人。

答案 1 :(得分:3)

找到更好的设计。 Java不能像这样工作。所有返回类型的唯一公共类是Object(boolean - &gt; Boolean)。在将此方法强制转换为适当的类型之前,是否要在每次调用此方法时检查返回类型的类。

您的设计也很糟糕,因为枚举意味着代表一组有限的值,每个值都具有相同的类型和属性。您正在创建三个完全不同的对象,代表三种不同的东西。

您需要查看您的用例并提出更好的设计。你甚至可以发一个单独的问题来征询意见。

答案 2 :(得分:1)

这应该可以解决问题:

public String getEnumValue()
{
    if(parameter != null){
        return parameter;
    }
    if(truth != null){
        return Boolean.toString(truth);
    }
    return name();     
}

您还应该将布尔值更改为大写字母B'布尔值'

但是,正如其他人所说,这可能是一个值得怀疑的设计。

回答真正的问题“如何返回与给定变量相匹配的类型?”你没有。但是,如果要保留值的实际返回类型,则可以将返回值设为Object:

public Object getEnumValue()
{
    if(parameter != null){
        return parameter;
    }
    if(truth != null){
        return truth;
    }
    return this;     
}

答案 3 :(得分:0)

类和接口究竟出了什么问题?

interface Thing<E> {
    E getValue();
}

class Name implements Thing<String>{
    private String parameter;
    Name(String p){parameter = p;}
    String getValue(){return parameter;}
}

class Something implements Thing<Void>{
    Void getValue(){return null;}
}

class IsWorking implements Thing<Boolean>{
    private boolean truth;
    IsWorking(boolean t){truth = t;}
    Boolean getValue(){return truth;}
}