0

最近,我发现了以下结构的代码:

接口

public interface Base<T> {

    public T fromValue(String v);

}

枚举实现

public enum AddressType implements Base<AddressType> {

    NotSpecified("Not Specified."),

    Physical("Physical"),

    Postal("Postal");

    private final String label; 

    private AddressType(String label) { 
        this.label = label; 
    } 

    public String getLabel() { 
        return this.label; 
    }

    @Override
    public AddressType fromValue(String v) {
        return valueOf(v);
    }
}

我的直接反应是无法通过反序列化或反射创建枚举实例,因此fromValue()应该是静态的。

我不是要开始辩论,但这是正确的吗?我读过,为什么 Enum 会实现一个接口,我完全同意所提供的答案,但上面的例子是无效的。

我这样做是因为“建筑师”不想接受我的回答,所以这是为了创造一个强有力的论据(有事实)为什么上述方法是好/坏的。

4

3 回答 3

1

您的Base接口未声明valueOf,并且该fromValue方法确实已实现。我看不出为什么这段代码不应该编译。如果您指的是valueOf内部调用fromValue,那是对为每个枚举定义的静态方法的调用。不过,我不得不同意,它的设计是非常错误的,因为您需要枚举的任意成员来调用fromValue并获取真正的成员。

另一方面,在我现在正在做的一个项目中,我有几个枚举实现了一个通用接口。这是因为枚举是相关的,我希望能够根据它们的共同语义统一对待它们。

于 2012-08-01T09:47:15.003 回答
1

在我看来,这种设计是错误的。为了使用valueFrom(),必须事先获取此枚举的实例。因此,它看起来像:

AddressType type = AddressType.Postal.valueFrom("Physical");

它有什么意义?

于 2012-08-01T10:14:38.503 回答
0

您的 Base 界面似乎有其他用途(如果有的话)。

它可能是一个 String-to-T-converter,因为它从 String 生成一个 T。如果它实现了这个接口,那enum是完全错误的(@yegor256 已经指出了原因)。所以你可以保留枚举,你可以在它的方法中有一些AddressTypeConverter implements Base<AddressType>调用。AddressType.valueOf()fromString()

但不要误会我的意思:实现接口的枚举并不是一个坏习惯,只是这种特殊用法是完全错误的。

于 2012-08-01T10:22:22.497 回答