1

如果我有以下

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

4 回答 4

3

你不能写这样的方法,它对每种情况都有不同的返回类型!(除非你返回Object,但这会很麻烦。)事实上,我闻到了一个设计问题——每个枚举值都应该有它的每个属性的值,有一些属性的值而不是其他属性的值是有问题的。

于 2012-11-29T22:46:10.567 回答
3

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

您的设计也很糟糕,因为枚举旨在表示一组有限的值,每个值都具有相同的类型和属性。您正在创建三个完全不同的对象,它们代表三种不同的事物。

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

于 2012-11-29T22:48:10.290 回答
1

这应该可以解决问题:

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

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

但是,正如其他人所说,这可能是有问题的设计。

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

public Object getEnumValue()
{
    if(parameter != null){
        return parameter;
    }
    if(truth != null){
        return truth;
    }
    return this;     
}
于 2012-11-29T22:49:55.070 回答
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;}
}
于 2012-11-29T22:51:21.157 回答