web-dev-qa-db-ja.com

「パブリックスタティックファイナル」は、Javaインターフェイスの定数に対して冗長ですか?

このコード:

interface Config {
    int MAX_CONN = 20;
}

期待通りにコンパイルして動作しました。これは次と同じように見えます:

interface Config {
    public static final int MAX_CONN = 20;
}

Javaインターフェイスの定数に対して「public static final」は冗長ですか?Java 1.1、1.2、1.3、1.4、...、 1.8またはJavaリリースで変更されましたか?

41
gavenkoa

インターフェイスで宣言された変数は暗黙的にpublic static final。これが JLS 9. の意味です:

インターフェイスの本体のすべてのフィールド宣言は、暗黙的にpublic、static、およびfinalです。そのようなフィールドにこれらの修飾子の一部またはすべてを冗長に指定することは許可されています。

JLSを読んで、なぜこれが行われたのかを理解してください。

これを見てください SO回答

Javaインターフェイスはそれ自体ではインスタンス化できないため、変数の値はインスタンスが存在しない静的コンテキストで割り当てる必要があります。最後の修飾子は、インターフェイス変数は、プログラムコードによって再割り当てできない真の定数です。

58
NINCOMPOOP

インターフェイスvariablesは暗黙的にstaticおよびfinalです。これは、Javaインターフェイスを単独でインスタンス化できないためです。

インターフェイスはinterfaceキーワードを使用して宣言され、メソッドシグネチャと定数宣言(staticとfinalの両方として宣言される変数宣言)のみを含めることができます。インターフェイスにメソッド定義を含めることはできません。

http://en.wikipedia.org/wiki/Interface_(Java)

3
Suresh Atta

Javaインターフェイスはそれ自体ではインスタンス化できないため、変数の値は静的コンテキストで割り当てる必要があります-インスタンスは存在しません。最終修飾子は、インターフェイスに割り当てられた値変数は、プログラムコードによって再割り当てできない真の定数です。

2
3yakuya

インターフェイス変数は常に静的で最終的なものです。

1
eyadMhanna

interfaceをクラスにリファクタリングする必要がある場合、冗長なpublic static final、しかし。 (各IDEは冗長な情報としてフラグを立てるので、これは奇妙に聞こえます)。

[〜#〜] edit [〜#〜]公平を期すために:他の多くの場所を変更せずにこれを行うことはできません(インターフェースはimplements、クラスからの継承中はextendsを使用)

EDIT#2実際、定数インターフェースはアンチパターンとみなすことができます。 wikipedia-定数インターフェース

0
huch