2016-12-15 3 views
1

でそれらを使用します。は、Javaの定数を定義し、私はこれに似たクラス持つコレクション

class DomainTypes { 
    public static final DomainType DOMAIN_1 = DomainType.of("example1.com"); 
    public static final DomainType DOMAIN_2 = DomainType.of("example2.com"); 
    public static final DomainType DOMAIN_3 = DomainType.of("example3.com"); 

    public static Set<DomainType> getDomainTypes() { 
    return ImmutableSet.of(
     DOMAIN_1, DOMAIN_2, DOMAIN_3 
    ); 
    } 
} 

をしかし、これはエラーが発生しやすくなります。誰かが新しい定数としてドメインを追加した場合、それをgetDomainTypes()メソッドに追加することを忘れることがあります。可能であれば、私は反射を使用したくありません。

私はDomainTypeクラスを別のモジュール(jar)に持つ必要があります - APIモジュールの種類 - DomainTypesよりもdns-apiモジュールを考えてみましょう。 DomainTypesはむしろ構成であり、dns-apiモジュールに依存するweb-appモジュールにあります。列挙型では、ロジックを実装したオブジェクトから構成を分離できず、別のアプリケーションでdns-apiモジュールを再利用することができませんでした。だから私はenumを使用してその私のための解決策ではないと思う。

+3

はとして列挙し、ドメインを使用しますそこにはプライベートフィールドがあります。次に、 'BlubEnum.values()'を使うことができます。 – Tom

+0

定数を持つクラスではなく、['enum'](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)を使用できます。列挙型は自動的に 'enum'のすべての定数を与える' values() 'メソッドを持っています。 – Jesper

+0

また、 'enum'には' EnumSet'のようなクラスがあり、それらの値を非常に効率的なセットとして得ることができます。 – RealSkeptic

答えて

1

は定数とenumの代わりにクラスを使用します。

public enum DomainType { 
    DOMAIN_1("example1.com"), 
    DOMAIN_2("example2.com"), 
    DOMAIN_3("example3.com"); 

    private final String url; 

    DomainType(String url) { 
     this.url = url; 
    } 

    public String getUrl() { 
     return url; 
    } 
} 

列挙型は、自動的にあなたのすべての値の配列を与えるvalues()方法いる:

DomainType[] domainTypes = DomainType.values(); 
+0

私も 'enum'と考えました。しかし、私は 'DomainType'より' dns-api'モジュールを言うと、別のモジュール(jar)に 'DomainType'クラスを持っている必要があります。 'DomainTypes'はむしろ設定であり、' dns-api'モジュールに依存する 'web-app'モジュールにあります。 'enum'では、実装されたロジックで設定をオブジェクトから切り離すことができず、別のアプリケーションで' dns-api'モジュールを再利用することができませんでした。 – fxmasa

関連する問題