4

常に、次のようなインターフェイスで定数を配置する場所を考えています。

public interface MyInterface {
...
    public static final String MY_CONST = "const";
...
}

または次のようなクラスで:

public class MyClass implements MyInterface {
...
    public static final String MY_CONST = "const";
...
}

定数を定義するのに適した場所はどこですか?

4

5 に答える 5

5

一定のインターフェイスパターンは悪い習慣かもしれませんが、インターフェイスに定数を入れても、それが一定のインターフェイスになるわけではありません。したがって、定数がインターフェイスレベルで関連している場合(そのインターフェイスのすべてのクライアントに関連している場合)、先に進んで定数をインターフェイスに配置します。それは何も悪いことではありません。

于 2012-05-27T18:14:20.577 に答える
2

定数の定義にインターフェースを使用しないでください。

詳細な説明については、Robert C.Martinの著書CleanCode、またはJoshBlochのEffectiveJavaを参照してください。トピックはこれらの作品で詳細に議論されています。

主な理由は、定数の値を検索している人を本当に混乱させる可能性があるためです。

たとえば、大量の定数を使用してそのインターフェイスを実装するクラスAがあるとします。次に、Bもそのクラスを拡張します。つまり、すべての定数をサブクラスの名前空間にも委任します。

これは、大量の静的インポートを使用するのと少し似ていますが、これも読みやすさに反します。

于 2012-05-27T18:11:29.090 に答える
0

インターフェイスを使用しないもう1つの理由:インターフェイスからインポートされた定数値は、usingクラスに埋め込まれます。インポート関係が消えます。インターフェイス定数が異なる値を取得した場合、コンパイラは必ずしもそれを検出してクラスを再コンパイルするわけではありません。

それは少し信じられないほどで、実際には修正可能なバグです。

于 2012-05-27T18:19:26.460 に答える
0

インターフェイスには多くの実装があります。定数で表される値がすべての実装に共通であり、インターフェースコンテキストで意味がある場合は、インターフェースで宣言する方が適切です。

それ以外の場合、値が特定のクラス実装とその子孫に固有である場合は、それらをクラスに配置する方が適切です。

正しいことも悪いこともありませんが、コンテキストは多かれ少なかれ適切です。

于 2012-05-27T18:14:14.293 に答える
0

インターフェイスは、実装ではなく契約を定義することを目的としています。定数はビジネスロジックに何らかの価値を持っているため、実装の一部と見なしています。

したがって、クラスで定数を定義することは理にかなっています。より良い説明と推論はこの記事を読んでくださいインターフェースまたはクラスで定数を定義する

于 2020-05-12T01:13:58.027 に答える