java - 具有不可变参数的自引用枚举

标签 java enums self-reference

考虑以下 sscce

public enum Flippable 
  A (Z), B (Y), Y (B), Z (A);

  private final Flippable opposite;

  private Flippable(Flippable opposite) {
    this.opposite = opposite;
  }

  public Flippable flip() {
    return opposite;
  }
}

这不会编译,因为 ZY 还没有被声明为 A 的参数>B 的构造函数。

可能的解决方案 1:硬编码方法

public enum Flippable {
  A {
    public Flippable flip() { return Z; }
  }, B {
    public Flippable flip() { return Y; }
  }, Y {
    public Flippable flip() { return B; }
  }, Z {
    public Flippable flip() { return A; }
  };
  public abstract Flippable flip();
}

虽然功能正常,但从风格上看这似乎很粗俗。虽然我无法解释为什么这会成为一个真正的问题。

可能的解决方案 2:静态加载

public enum Flippable {
  A, B, Y, Z;

  private Flippable opposite;

  static {
    for(Flippable f : Flippable.values()) {
      switch(f) {
      case A:
        f.opposite = Z;
        break;
      case B:
        f.opposite = Y;
        break;
      case Y:
        f.opposite = B;
        break;
      case Z:
        f.opposite = A;
        break;
      }
    }
  }

  public Flippable flip() {
    return opposite;
  }
}

这比第一个解决方案更粗暴,因为该字段不再是最终的,并且容易受到反射的影响。归根结底,这是一个晦涩难懂的担忧,但暗示了一种糟糕的代码味道。

有没有一种与第一个示例基本相同但可以正确编译的方法?

最佳答案

也许没有您想要的那么漂亮...

public enum Flippable {
    A, B, Z, Y;

    static {
        A.opposite = Z;
        B.opposite = Y;
        Y.opposite = B;
        Z.opposite = A;
    }

    public Flippable flip() {
        return opposite;
    }

    private Flippable opposite;

    public static void main(String[] args) {         
        for(Flippable f : Flippable.values()) {
            System.out.println(f + " flips to " + f.flip());
        }
    }
}

关于java - 具有不可变参数的自引用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19429343/

相关文章:

java - MPAndroidChart : Word wrap for BarChart

java - 枚举性能中的单例

mysql - 如何在没有 if/case 流的情况下在 SQL 中返回 Yes 或 No

java - 在API响应中返回Enum的值而不是Spring boot中的名称

objective-c - 将 Obj C 代码转换为 Swift weak self

java - 给定一串字符时查找所有有效单词(递归/二进制搜索)

java - Java中Wallis函数的递归实现

java - Oracle:插入 simbol '&' 时出现问题

java - 自引用类型和有界通配符之间的不良交互

javascript - JavaScript中有身份索引值吗?