2011-12-30 5 views
2

定数インターフェイスの反パターンについて読んでいるうちに、インスタンスのない最終的な定数クラスが定数インターフェイスより優れていることがわかりました。
どうすればいいですか?インスタンスを持たない最終的な定数クラスは定数インターフェイスよりも優れていますか?

public interface ConstIfc { 
    public static final int constValue = 10; 
} 

public final class ConstClass { 
    private ConstClass{} 
    public static final int constValue = 10; 
} 

ifc /クラス名の名前を付けずにUtilClassでconstValueを使用する必要がある場合、それらを実装/拡張できます。実装は複数の継承をサポートします。ですから、どのように伸びていますか
注:静的インポートを理解できます。

答えて

1

インターフェイスは抽象化されているため、実装の詳細(定数変数を含む)を含むべきではありません。インターフェイスは、実装の詳細が属していないパブリックAPIを記述するためによく使用されます。このため、インターフェイスではなく、クラスに定数データを格納するのが理にかなっています。

の意味はわかりません。どのように改善されていますか?がありますが、この種の実装の詳細を複数のクラスに継承/拡張することは避けてください。実装の継承を不適切に活用すると、しばしば柔軟性のない設計につながります。あなたの例では、キーワードがConstClassの場合、インターフェイスでは不可能であることを防ぐためにコンパイラが利用されています。

+0

ありがとう:) –

7

私は静的なインポートがあるので、定数クラスまたはインターフェイスを拡張または実装する必要はないという議論があると思います。したがって、静的インポートを使用する場合、定数のクラスを持つことは、クラスが実際にどのようなものか、インターフェイスと比べてよりよく適合します。それを最終クラスにすることは、反パターンを適用する誘惑を取り除きます。つまり、定数を定義する型を拡張または実装します。

実際には、あなたが使っているパターンにあまり差がないとは思わない。

+0

素晴らしい!ありがとう。したがって、最終的なクラスは、静的インポートの観点から定数インターフェイスよりも優れており、すべての定数を継承することを避けることによってより優れています。リット? –

+0

静的フィールドオブジェクトはクラスレベルで作成されるため(すべてのオブジェクトに共通)、特定のフィールドで静的にインポートされ、継承されている(インプリメンテーションを使用して)すべてのフィールドが同じ量のメモリを作成しますか? –

+0

For Exampleここでは、いくつのMyOwnオブジェクトが作成されますか? 'code' class MyOwn {} パブリックインターフェイスConstantIfc { public final static MyOwn REF = new MyOwn(); }クラスAはConstantIfc {}を実装しています。クラスBはConstantIfc {}を実装していますpublic class c {public static void main(String ... arg){A refA = new A(); B refB = new B(); }} –

3

定数を持つクラス/インターフェイスの代わりにEnumsを使用することを検討する必要があります。はるかに柔軟で、強力で堅牢な選択肢です。

+0

はい私はそれを知っています。ありがとう。 –

+0

はい、いつもベストではありません。たとえば、DAYS_IN_WEEKまたはPIまたは任意の数の他の真の定数は、プレーンなintによって最もよく記述されているようです。 – Saish

関連する問題