1

次の2つのアプローチのどちらが良いでしょうか?通常の場合、サブタイプpolymorphishmが最良のアプローチであるため、列挙型を選択しました。また、これは単純なファクトリメソッドを作成する場合の一般的なアプローチです。

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の2番目の実装。これはより明確で、コードの重複はありません。

    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では列挙型がキーであり、値ではないためです。

実際、@ Peter Lawreyが受け取ったコメントは、2番目の提案に従わないと発生する問題を強調しています。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

switchJava 7では、Stringで使用できます。

SomeEnumコンストラクターを使用して他の場所でクラス化しますSomeEnum(Integer) {..;}

例のようにすることができるので、にprivateなります。Pattern.classreturn 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 SomeEnumenum

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 に答える