私はあなたが言っていることを知っています。
たとえば、インターフェイス(ExecutableListと呼んでいます)に、次のような定数文字列フィールドを設定したいとします。USER_FRIENDLY_NAME
public interface ExecutableList<T extends ExecutableList<T,E>,E> //This is type parameter
extends List<E>, //self referencing. Trust
Comparable<E>, //me, it has its uses.
{
/** This would declare a constant but leave it to sub-interfaces/classes to define it. */
abstract String USER_FRIENDLY_NAME;
//Define the rest of your interface
}
残念ながら、これはJavaでは不可能です。Javaインターフェースでフィールドを宣言する場合、それは修飾子、、、およびを意味public
しstatic
ますfinal
。Javaプログラミング言語への将来の変更により、abstract
追加が可能になる可能性があります。これにより、暗黙の修飾子public abstract static final String USER_FRIENDLY_NAME;
が作成されますが、このためのルールを明確に定義できますが、通常、反対の意味を定義すると理解されているため、この単語の使用はabstract
混乱を招きます。abstract
final
私は、Javaの将来のバージョンがこれを実装することを考えています。プライベートインターフェイスメソッドがJava9で追加されると聞きましたが(デフォルトのメソッド間で使用するため)、この言語への追加についてはまだ何も語られていません。最初に考慮すべき後方互換性の問題がいくつかあると思います。Oracleの誰かがこれを読んだら、インターフェイスの定数を宣言し、継承するクラス/インターフェイスにそれらを定義させてください!!!
それまでの間、唯一のオプションはString getUserFriendlyName();
、インターフェースまたは抽象クラスでメソッドを定義することです。それほどエレガントではなく、おそらくそれほど効率的ではありませんが、現在、他の選択肢はありません。