1

以下两种方法哪个更好?我选择了枚举,因为在典型情况下,子类型多态是最好的方法;这也是编写简单工厂方法时的典型方法。

public class SomeClass {
    public SomeEnum returnAType(String someString) {
        //implementation bellow
   }

   private boolean method1() {
   //...
   }

   private boolean method2() {
   //...
   }

   private boolean method3() {
   //...
   }

}

returnATypeMethod 的第一个实现;这更快,因为如果method1有效,它不会调用method2和method3(可能更多)。

    public SomeEnum returnAType(String someString) {
        if(method1(someString)) {
            SomeEnum.ENUM1.doSomething();
            return SomeEnum.ENUM1;
        }
        if(method2(someString)) {
            SomeEnum.ENUM2.doSomething();
            return SomeEnum.ENUM2;
        }
        if(method3(someString)) {
            SomeEnum.ENUM3.doSomething();
            return SomeEnum.ENUM3;
        }
        SomeEnum.DEFAULT_ENUM.doSomething();
        return SomeEnum.DEFAULT_ENUM;
   }

returnATypeMethod 的第二个实现;这更清楚,没有代码重复:

    public SomeEnum returnAType(String someString) {
        SomeEnum enumType = SomeEnum.DEFAULT_ENUM;
        if(method1(someString)) {
            enumType = SomeEnum.ENUM1;
        }
        if(method2(someString)) {
            enumType = SomeEnum.ENUM2;            }
        }
        if(method3(someString)) {
            enumType = SomeEnum.ENUM3;
        }
        enumType.doSomething();
        return enumType;
   }
4

3 回答 3

2

我很想使用

public SomeEnum returnAType(String someString) {
    SomeEnum enumType = method1(someString) ? SomeEnum.ENUM1 :
                        method2(someString) ? SomeEnum.ENUM2 :
                        method3(someString) ? SomeEnum.ENUM3 : SomeEnum.DEFAULT_ENUM;
    enumType.doSomething();
    return enumType;

}

于 2012-07-23T09:41:11.877 回答
1

我发现 Java 枚举非常令人困惑,一般来说,当您不只是枚举时,我建议尽量避免使用枚举。您可以将代码组织成一个接口或一个抽象类,以及几个实现该接口或抽象类的单例。最终的设计更清晰,更易于理解。

我强烈建议尽量避免使用返回 T 并在内部调用 t.someMethod 的方法。这种模式再次令人困惑和误导。将您的 returnAType 视为您的单例的工厂方法,此函数的目标只是为您返回正确类型的单例

如果您的函数不使用某些模式而是使用简单的等式,请使用数据结构来存储键值关联。不是有人说的 EnumMap ,因为在 EnumMap 中, Enum 是键,而不是值。

事实上,@Peter Lawrey 收到的评论强调了如果您不遵循第二个建议会遇到的问题:不要编写返回 t 并通过 t 产生副作用的方法。我的建议是部分遵循它的建议,但以这种方式将副作用移到外面:

// Beautiful and testable with no side-effects

public SomeEnum returnAType(String someString) {
    SomeEnum enumType = method1(someString) ? SomeEnum.ENUM1 :
                        method2(someString) ? SomeEnum.ENUM2 :
                        method3(someString) ? SomeEnum.ENUM3 : SomeEnum.DEFAULT_ENUM;

    return enumType;
}

// Do something for real
public void doSomethingWith(String someString) {
    SomeEnum enumType = returnAType(someString);
    enumType.doSomething();
}
于 2012-07-23T09:44:55.617 回答
0

在 Java 7 中,您可以使用switchString :

SomeEnum用 Constructor 在别处上课SomeEnum(Integer) {..;}

它可以privatePattern.class例子一样,所以它会是return SomeEnum.set(1);

public SomeEnum returnAType(final String someString) {
     switch (someString.toLowerCase()) { //toLowerCase() if needed
        case "one":
            return new SomeEnum(1);
            break;
        case "two":
            return new SomeEnum(2);
            break;
        case "three":
            return new SomeEnum(3);
            break;
        default: 
            return new SomeEnum(-1); // or zero or Integer.[MIN|MAX]_VALUE
            break;
      }
}

然后您可以根据需要使用 SomeEnum 。

有些模型不喜欢中间返回,所以你可以在里面添加一个临时的 SomeEnum 并在最后返回它。

typeOf SomeEnum是_enum

public SomeEnum returnAType(final String someString) {
     switch (someString.toLowerCase()) { //toLowerCase() if needed
        case "one":
            return SomeEnum.ENUM1;
            // break; // Normaly break; is unused, you can  remove it
        case "two":
            return SomeEnum.ENUM2;
        case "three":
            return SomeEnum.ENUM3;
        default: 
            return SomeEnum.DEFAULT_ENUM; 
      }
}
于 2012-07-24T07:08:49.087 回答