要求:我希望接口的所有实现都具有明确定义的名称。
一开始,我想:
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();
}
}
2)强制实现者Fruit
用一些东西注释名称:
class Apple implements Fruit {
@FruitName
public static final NAME = "apple";
...
}
显然这个实现比(1)干净得多,但我不确定这在 Java 中是否可行?如果@FruitName 不存在,您如何使编译/构建失败?