新しいクラスのコンストラクタを含む関数を提供する列挙型が必要です。 Java8の前に私はこのコードを書いていました:関数を含むjava enum - メンバー変数としてスイッチまたはサプライヤを使用する
enum Fruit1 {
APPLE, BANANA;
public Tree getTree() {
switch (this) {
case APPLE:
return new AppleTree();
case BANANA:
return new BananaTree();
default:
throw new IllegalStateException();
}
}
}
ここではラムダ式を使用できます。利点は、新しいenumエントリを追加するときに、switch文にsthを追加することを忘れることができないことです。しかし、私はコードがもっと複雑に見えてしまうのではない。
enum Fruit2 {
APPLE(AppleTree::new), BANANA(BananaTree::new);
Supplier<Tree> treeSupplier;
Fruit2(Supplier<Tree> treeSupplier) {
this.treeSupplier = treeSupplier;
}
public Tree getTree() {
return treeSupplier.get();
}
}
それは単なる味の問題か、それ以上のものですか?ラムダ式を使ってより良い方法でそれを行うことはできますか?
これはother questions comparing lambda expressions to abstract methodsと関連の深いものですが、スイッチの表現に焦点を当てたいと思います。ラムダ式と比較してもかなり快適です。
コードがもっと複雑に見えたら、なぜそれを使いたいのですか?私はそれがより簡単でより良いことがわかります。しかし、あなたがより良く考えるものを定義します。 – Tunaki
[Java 8のenumsでメソッドをオーバーライドする理由はありますか?](http://stackoverflow.com/questions/28277562/is-there-any-reason-to-override-methods-in-enums-in) -java-8) – sprinter
ラムダ式の変種は条件付きではありませんが、ホットスポットオプティマイザは、 'switch'ステートメントバリアントをパフォーマンスに関連するものにする場合、同様の結果に最適化できるはずです。そして、唯一の違いは、 'switch'文に' default:throw IllegalStateException(); 'を書く必要があることです。ラムダバリアントはそれを必要としません... – Holger