要件:インターフェイスのすべての実装に明確に定義された名前を付けたい。
最初、私は思った:
interface Fruit {
public String getName();
}
ただし、これにより、ユーザーは実行時に変更されるフィールドを持つことができます。コンパイル/ビルド時に定義される不変の名前が欲しいのですが。
私はそれを行うために他のいくつかの方法をいじっていますが、それぞれに制限があります。
1)名前にタイプを付けます。これは自由形式の文字列よりもわずかに制御しやすいものです。
interface Fruit {
public FruitName getName();
}
abstract class FruitName {
public final String NAME;
public FruitName(name) {
this.NAME = name;
}
}
このクラスのユーザーは次のようになります。
class AppleFruitName extends FruitName {
public AppleFruitName() {
super("apple");
}
}
class Apple implements Fruit {
public FruitName getName() {
return new AppleFruitName();
}
}
Fruit
2)の実装者に名前に何か注釈を付けるように強制します。
class Apple implements Fruit {
@FruitName
public static final NAME = "apple";
...
}
明らかに、この実装は(1)よりもはるかにクリーンですが、これがJavaで可能かどうかはわかりません。@FruitNameが存在しない場合、どのようにしてコンパイル/ビルドを失敗させますか?