なぜなstaticメソッドにインタフェースではないstaticフィールドは、内部クラスはOK?【事前Java8][複製]
質問
この質問に答えはこちら
あるいは複数の質問についてはこちらかできな定義における静的メソッド内の界面でアドレスの基本的な矛盾:できないのはなぜで定義するstaticは、静的内部型内にインターフェースが静的な方法を教えてください。
静内に種類もない公平に比較、その統語だけで砂糖を生成する新しいクラスだが、なぜ分野がない方法について教えてほしい。
引数に対する静的メソッド内のインタフェースがることがまとめられることにより、仮想テーブルの解決戦略のJVMがないことにも同様に適用ではないstaticフィールド、のコンパイラでインラインです。
一貫性は私が望む、Javaはいずれ支えのない統計にはどのような形態の内、最新のインスタレーションでと整合するべきであるとき。
解決
An 公式の提案 されている静的方法インタフェースJava7.この提案は下 プロジェクトコイン.
私の個人的な意見はこの素晴らしい試みですね。ありません技術的な難易度に実施すべきと思うかもしれないが、非常に論理的かつ妥当ないことだと思います。が提案プロジェクトコインがいます ない の一部となるのは、Java言語であるクリーンに多数のApiを用意しています。例えば、 Collections
クラスのstaticメソッド を操作するための他 List
実施者に含めることができるのかを List
インタフェース。
更新: の Java Posse Podcast#234, ジョー-D'arcyの提案について、簡単に言った"複合"とはないであろうが、下のプロジェクトコイン.
更新: をしていなかったからでプロジェクトコインのためのJava7,Java8を支持 静的な機能インタフェース
他のヒント
私と私の持論ですが、不整合この場合には便利ではなくデザインは必要かというのは、聞いたことのない論をしたいずれかのされています。
ではないStaticフィールドがあるの(a)もありましたJDK1.0、多くの危険に基づき決定されたJDK1.0(b)static finalインタフェースは最も近いものをjavaのための定数です。
静内部クラスのインタフェースのための純粋な統語的糖鎖の内部クラスなんの親クラスです。
なので静方法な可能で説得力のある理由はありませんしていただくことになります。一貫性のない十分な現状を変更.
もちろん、これが認められ、将来の"環太平洋のバージョンを崩さずです。
あなポイントを宣言する静的方法インターフェース。できない実行することにより、通常の通話MyInterface.staticMethod().(編集:その前文に戸惑をお持ちの方も呼び出します。staticMethod()を実行しを精密に実施staticMethodにMyClassる場合MyClassから構成されるインタフェースに存在するのではなく!) お問い合わせいただいた場合によって指定の実装するクラスMyImplementor.staticMethod()を常に把握しておく必要がある実際のクラスでは無関係なのかどうかのインタフェースです。
より重要なのは、staticメソッドはオーバーライドさせ、しようとした場合におい:
MyInterface var = new MyImplementingClass();
var.staticMethod();
のルールを静止しているとは言い方法で定義されて宣言された型のvar必ず実行されます。このインタフェースです、これは不可能である。
きのコースでは必ず、静キーワードからの研究"に関するお問合せありません。きを抑制する警告といえば"からのインスタンス方法。
答えによらのコメントは、以下の理由にできない実行"result=MyInterface.staticMethod()"であることを実行しのバージョンの方法で定義されMyInterface.ができないバージョンで定義されMyInterfaceでのインタフェース.でないコードによる定義で設定します。
目的でのインタフェースを定義しなく契約を実施。そのため、できないstaticない実装でインターフェイスからできませんオーバーライド静的ます。どの分野では、静的 final fields
は、本来、定数(1.5+対応させていただきまenumsインタフェース).の定数が定義するインターフェイスマジック番号
余談ですが、必要はありませんが明示的に指定 static final
修飾子の分野にインタフェースでのみstatic finalも可能です。
このスレッドが、これはとても重要な質問です。てんこの日に限って理解しようとす洗浄方法:
の主な目的はインタフェースを提供するものではunimplementableが提供されてい
静的メソッドを許可する
話ができる方法を用い interfaceName.staticMethodName(), が、これは未実装方法を含んでいます。なので無駄なる静的ます。そのためではないことです。
ではないstaticフィールドを許可
でな実行可能な、実行可能なうときなどは行いません論理的に運転できない操作です。く変わるということはありませんが行動の分野だからこそ可能です。
内部クラスを許可
内部クラスはこれまで作成の異なるクラスファイルの内部クラスで作成したい InterfaceName$InnerClassName.class なので基本的にご提供の実施が違法となインタフェース。で実施内部クラスです。
これが役に立つだろう。
実際にものには理由があります誰かにできないかも静ます。ものとして使用できるファクトリメソッドをを実装するクラスのインタフェース。例えば、だからこそ、そしてCollectionインタフェースおよびコレクションにクラスopenjdkます。あなたの回避策として常時提供のクラス専用コンストラクタとして、"名前空間"のための静的ます。
前のJava5、共通利用のためのstaticした:
interface HtmlConstants {
static String OPEN = "<";
static String SLASH_OPEN = "</";
static String CLOSE = ">";
static String SLASH_CLOSE = " />";
static String HTML = "html";
static String BODY = "body";
...
}
public class HtmlBuilder implements HtmlConstants { // implements ?!?
public String buildHtml() {
StringBuffer sb = new StringBuffer();
sb.append(OPEN).append(HTML).append(CLOSE);
sb.append(OPEN).append(BODY).append(CLOSE);
...
sb.append(SLASH_OPEN).append(BODY).append(CLOSE);
sb.append(SLASH_OPEN).append(HTML).append(CLOSE);
return sb.toString();
}
}
この HtmlBuilder を行う予定数で利用可能 OPEN の代わりに HtmlConstants.OPEN
を実装しこの方法では最終的には混乱している。
今Java5、 輸入静 書式では、同様の効果が得られ:
private final class HtmlConstants {
...
private HtmlConstants() { /* empty */ }
}
import static HtmlConstants.*;
public class HtmlBuilder { // no longer uses implements
...
}
ありの理由がなく静的方法インタフェース以外:Java言語でデザイナーはそのようにしています。えることができるとされていることを意できます。後のすべてのabstractクラスでいます。思がなされているので,できる"手工芸"バイトコードのインタフェースは、staticメソッドので、まぁ仕事りなる群から選ばれた少なくともるメソッドを呼び出し及び/又はインタフェースを使用しています。
いくつかのstaticメソッドは全くないのでしょうか。いてその使用が、パッケージ/名前空間レベルの方法であろうカバーで80のstaticメソッドを使用します。
理由は主に二つの泉を心
静的メソッドJavaできませんオーバーライドするサブクラスは、これはもっと大きな取引のための方法により静ます。実際にことがありませんでしたオーバーライドドでのサブクラスがオーバーライド方法。においてはstaticメソッドを防止実装するクラスからインタフェースの供給を独自に実装できる方法は、主に敗戦の利用目的に、インターフェース。
界面になってコードこの抽象クラスです。全てのインターフェースでみについてお話しいただけまあ-無関係なオブジェクトがすべて一定の方法。実際に提供する実装は、これらのメソッドは範囲外とのインタフェースを想定した.
静的メソッドにつながりができます。Javaでは、インターフェースは技術的にはクラスではないクラス(このため、キーワードに実装し、インターフェイスはオブジェクトでのインタフェースがない授業になってstaticメソッドがありますので実際のクラスを添えます。
でご覧いただけまInterfaceName.class 取得に対応するClassオブジェクトのインタフェースのクラスのクラスの具体的状態を表すクラスおよびインタフェースは、Javaアプリケーションしかし、インターフェースはないものとして扱われのクラスとはできませんを添付して静的な方法です。
みstatic finalが宣言されたインタフェースのような方法では、公共のない場合でも、"公開"をキーワードに、静的な分野の"最終"のkeyword).
これだけの価値、およびコピーされ、文字通りがどこにいても使用でコンパイル時にいう"通話"ではないstaticフィールドで行います。有するstaticメソッドは同じ意味している呼び出しインターフェースな実装では、Javaいを与えることができます。
その理由はすべて定義されている方法インターフェースを表せるかどうかを明示的にすることを宣言を模倣しています。抽象的な静的メソッドは許容組み合わせの修飾子以降における静的メソッドできないことであるオーバーライドになります。
なぜンタフェースにより静ます。っているような気がするべきと考えられる"特集".の可能性にして私が考えられることはいうグループ定数を実装インタフェースの関係によります。
同意すること整合性のあいさつがとても良かったですよ。無静員されたインタフェース。
このstaticメソッドにアクセスできるのを作らずにオブジェクトおよびインターフェースできない作オブジェクトを制限するプログラマからのインタフェースのメソッドではなく、直接その実装クラスです。が設定されていない場合は、staticメソッドでは、最新のインスタレーションアクセスできますのでなく、その実装です。このstaticメソッドはインタフェースとは思わないことの一貫性は一つの関心事となっています。
Java1.8イstaticメソッドが見えるインタフェースのメソッドだければ、取り外しておりますのmethodSta1()メソッドからのInterfaceExampleクラス できなくなるのではないために使ってみては如何でしょうかInterfaceExampleオブジェクトです。しかしなstaticメソッドを利用するとともに、界面における静的メソッドを使用クラス名です。例えば、有効な決ます:exp1.methodSta1();
うなど、見所がたくさんあり以下の例と言えるでしょ:1)Javaインタフェースのstaticメソッドの一部であるインターフェースを使用できませんので実装クラスオブジェクト。
2)Javaインタフェースのstaticメソッドは提供するユーティリティメソッドは、例えばnullチェック、ソート、ログなど。
3)Javaインタフェースのstaticメソッドを提供するセキュリティを実装クラス(InterfaceExample)をオーバーライドします。
4)で定義フstaticメソッドオブジェクトのクラスメソッドまコンパイラエラーとして"このstaticメソッドできない非表示のインスタンスメソッドからのオブジェクト".ここではjavaからオブジェクトの基底クラスのすべてのクラスとしてできないクラスのstaticメソッドとは別のインスタンスメソッドと同じ署名を表します。
5)使用できるjavaインタフェースのstaticメソッドを削除ユーティリティクラスなどのコレクションや移動の全てを出すことができますstaticメソッドに対応するインタフェース このページに利用します。
public class InterfaceExample implements exp1 {
@Override
public void method() {
System.out.println("From method()");
}
public static void main(String[] args) {
new InterfaceExample().method2();
InterfaceExample.methodSta2(); // <--------------------------- would not compile
// methodSta1(); // <--------------------------- would not compile
exp1.methodSta1();
}
static void methodSta2() { // <-- it compile successfully but it can't be overridden in child classes
System.out.println("========= InterfaceExample :: from methodSta2() ======");
}
}
interface exp1 {
void method();
//protected void method1(); // <-- error
//private void method2(); // <-- error
//static void methodSta1(); // <-- error it require body in java 1.8
static void methodSta1() { // <-- it compile successfully but it can't be overridden in child classes
System.out.println("========= exp1:: from methodSta1() ======");
}
static void methodSta2() { // <-- it compile successfully but it can't be overridden in child classes
System.out.println("========= exp1:: from methodSta2() ======");
}
default void method2() { System.out.println("--- exp1:: from method2() ---");}
//synchronized default void method3() { System.out.println("---");} // <-- Illegal modifier for the interface method method3; only public, abstract, default, static
// and strictfp are permitted
//final default void method3() { System.out.println("---");} // <-- error
}