具有不可变参数的自引用枚举 [英] Self referential enum with immutable parameters

查看:101
本文介绍了具有不可变参数的自引用枚举的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请考虑以下 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;
  }
}

这不会编译,因为<$ c $没有声明允许c> Z 和 Y 作为 A 和 B 的构造函数。

This doesn't compile, because Z and Y haven't been declared to be allowed to be arguments of A and B's constructor.

可能的解决方案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();
}

虽然功能正常,但从样式上看,它似乎很粗糙。尽管我无法确定为什么这将是一个真正的问题。

While functional, this seems stylistically quite gross. Though I can't put a finger on why this would be a real problem.

潜在的解决方案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;
  }
}

这个领域不再是最终的,并且容易被反思。最终,这是一个令人费解的担忧,但会暗示一种不良的代码气味。

This is even more gross than the first solution, as the field is no longer final, and is vulnerable to reflection. Ultimately that is an obscure worry, but suggests a bad code smell.

有没有一种方法可以与第一个示例基本相同,但是

推荐答案

也许不是您想要的那样漂亮……

Again perhaps not as pretty as you were looking for ...

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());
        }
    }
}

这篇关于具有不可变参数的自引用枚举的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆