5

ファクトリメソッドで作成する正しいオブジェクトを使用するenumStringディスパッチする方が良いですか?static

String:

public static Car createCar(String carName){
    if(carName.equals("Ferrari")){
        return new Ferrari();
    }
    else if(carName.equals("Porsche")){
        return new Porsche();
    }
    ....
}

enum:

public static Car createCar(CarEnum carEnum){
    if(CarEnum.FERRARI.equals(carEnum)){
        return new Ferrari();
    }
    else if(CarEnum.PORSCHE.equals(carEnum)){
        return new Porsche();
    }
    ....
}

今のところ、私によると:

使用する利点enum:

  • ユーザーが未処理のファクトリを呼び出すことは避けてくださいcarName

使用の欠点Enum:

enumへの変更(たとえば、 にFERRARIなる) にはクライアントでの変更が必要になるため、依存関係を増やします。ENZO_FERRARIただし、クライアント コードを再コンパイルせずにインスタンスにStringリダイレクトできます。もちろん、リダイレクト先の古い値を使用してクライアントに対して同じことを行うこともできますが、私にとっては、クライアントと互換性を持たせるために古い値を保持する必要があることを意味します...私には意味がありません.FerrariEnzo FerrarienumFERRARIENZO-FERRARI enumenum

この件についてあなたの意見はどうですか?

4

5 に答える 5

4

この場合のように、メソッドに受け入れられる引数の数が固定されている場合は、メソッドのクライアントにできる限りその制約を適用することをお勧めします。この場合、古い文字列を受け入れると、列挙型を使用するよりも多くの失敗が発生します。

ただし、このような限られたケースでは、車の種類ごとに名前付きのファクトリ メソッドを使用することも検討してください: createFerrari()、createPorsche() など。

于 2011-10-09T11:08:01.753 に答える
3

ない。Enum を使用して、メソッドを Enum 自体のインスタンス メソッドにします。いいえ、必要ありません。

于 2011-10-09T11:06:58.510 に答える
1

私は使用しEnumsます; この場合に使用される文字列は好きではありません。列挙型の利点は、それらを切り替えることができ (文字列では機能しません)、誤った入力を処理する必要がないことです。

于 2011-10-09T11:06:26.810 に答える
0

のもう 1 つの利点は、infinite の代わりに構文enumを使用できることです。switch/caseif/else

于 2011-10-09T12:00:15.877 に答える
0

インスタンスメソッドを列挙型に追加しません。今日、列挙型で静的ブロックを使用し、列挙型を参照するときに、奇妙な予期しない動作が見られました。突然、列挙型インスタンスが null になりました!!!???
抽象的なファクトリ パターンを使用します。このようにして、2 つの列挙型インスタンスに同じファクトリを使用できます。
また、ハッシュマップを使用してファクトリを保存します。このように、循環的な複雑さを追加するケースやifはありません。

于 2013-04-05T20:55:31.353 に答える