gpt4 book ai didi

Java:强制接口(interface)的实现者具有不可变的名称字段?

转载 作者:行者123 更新时间:2023-12-01 07:36:18 26 4
gpt4 key购买 nike

要求:我希望接口(interface)的所有实现都有一个明确定义的名称。

最初,我想:

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 不存在,如何使编译/构建失败?

最佳答案

实现这一点的一个简单方法 - 无需 aop、编译时编织、运行时注释、运行时扫描等,就是将此行为封装在抽象类中:

interface Fruit {
public String getName();
}

abstract class FruitImpl {
private final String name;
public FruitImpl(name) {
this.name = name;
}

public final String getFruitName(){
return name;
}

}

因此,在构建时,每个实现都将被迫传递其名称,并且无法更改它(除非用户故意恶意)。这符合问题的措辞所暗示的内容。

但是存在差异,因为有些建议似乎假设接口(interface)的所有实现都将具有相同名称 - 尽管问题没有说明这一点。这些实现是单例的吗?

或者,您可以使用装饰器模式来包装实现并检索一次字段值,然后始终返回该值,如下所示:

class FruitWrapper implements Fruit{
private final String name;
public FruitWrapper(Fruit fruit) {
this.name = fruit.getFruitName();
}

public final String getFruitName(){
return name;
}

}

因此,您可以在任何需要使用水果的地方使用它,并且保证始终获得相同的值。

通过这种方式,您可以将不变性转移到您控制的类中。

关于Java:强制接口(interface)的实现者具有不可变的名称字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11530024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com