【问题标题】:Java generic Types for method signature on enums implementing用于实现枚举的方法签名的 Java 泛型类型
【发布时间】:2018-02-16 12:30:50
【问题描述】:

我基本上希望有一个enum 与特定的方法,例如

public interface PropertyTypeMethods {
    public int getTypeId();

    public void setTypeId(Integer typeId);
}

类似的东西

public enum BasePropertyTypes implements PropertyTypeMethods {

ONE, TWO;

private int typeId;

@Override
public int getTypeId() {
    return typeId;
}

@Override
public void setTypeId(Integer typeId) {
    this.typeId = typeId;
}

}

以及此枚举的扩展版本,例如

public enum ExtendedPropertyTypes implements PropertyTypeMethods {
HUNDRED, THOUSEND; 
// same as above
}

这将导致ONE.setTypeId(1) ==> ONE.getTypeId()==1 //true。这是基本概念。但现在我想调用一个通用方法,例如

private <E extends Enum<E> & PropertyTypeMethods> void initEnum(Enum<E> curType) {
   // the below approach does not work :-/
   curType.setTypeId(1); // or any other reasonable value....

但不知何故,我无法弄清楚 正确 方法签名是什么。在question 之后,我发现至少有一部分是谜题—— 但仍然没有得到它的方法签名。仍然不清楚如何在签名中正确指定curType 以执行适当的调用。

【问题讨论】:

  • 为什么是&lt;E extends Enum&lt;E&gt; &amp; PropertyTypeMethodes&gt;?要设置类型,&lt;E extends PropertyTypeMethods&gt; 就足够了。
  • 枚举应该是常量。如果您想要一个可变的“枚举”,请将其设为普通的旧类。
  • 只需创建一个类,给它一个privateprotected 构造函数并添加常量实例。瞧,它基本上是一个可变和可扩展的枚举。您还可以添加一个static 方法来提供该类的所有可用实例,例如枚举上的values()
  • 就像安迪说的,枚举值应该是常量。我认为您真正想要的是EnumMap
  • 好吧,我需要查看其他建议...。关于为什么? 主要问题是这个枚举已经在代码中杂乱无章。现在有一个突破性的变化来手动设置 id - 而不是硬编码(因为它是)。因此,请求......我很想拥有不同的 - 从一开始就

标签: java enums interface


【解决方案1】:

这将起作用:

private <E extends Enum<E> & PropertyTypeMethods> void initEnum(E curType) {
  curType.setTypeId(1);
}

但是,我认为将Enums 设为可变不是一个好主意(它们应该是常量值的标签,而不是带有状态的单例)。此外,您不应该编写需要 Enum 参数的方法,而他们应该关心的只是它的接口:

// This will be easier to work with down the road
private void initEnum(PropertyTypeMethods curType) {
  curType.setTypeId(1);
}

【讨论】:

  • 赞成指出整件事的无意义 ;-)
  • 感谢带有签名的提示解决了这个问题。我认为我的情况并不理想 - 但它适用于现有代码。
【解决方案2】:

正确的签名应该是

private void initEnum(PropertyTypeMethods onject) {
    object.setTypeId(1);
}

但正如 Andy Turner 所提到的,枚举应该是不可变的,即只有最终的不可变字段。因此,枚举也有一个构造函数Enum Types

如果你有更复杂的枚举,常见的实现方式如下

public enum BasePropertyTypes implements PropertyTypeMethods {
   ONE (new PropertyTypeMethods() {
          @Override
          public int getTypeId() {
              return 1;
          }
     });

    private final PropertyTypeMethods m;

    BasePropertyTypes(PropertyTypeMethods m) {
       this.m = m;
    }

   @Override
   public int getTypeId()
   {
      return this.m.getTypeId();
   }
}

但是从您的示例中,我建议您查看您的实际问题。可能枚举根本不是正确的方法。

【讨论】:

  • 是的,我需要审查 - 但无论如何,这个枚举在整个代码中都使用了 - 并且是一个重大更改 reg。 ID 需要一些其他措施 - 这并不是一开始的预期.. 也请参阅我的其他评论..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多