如何从Enum返回一个实例?

day*_*mer 6 java enums

考虑到我有Algorithm枚举

public enum Algorithm {
  SHA1("sha1"),
  HMAC("hmac"),;

  Algorithm(final String algorithm) {
    this.algorithm = algorithm;
  }
  private final String algorithm;

  public String getAlgorithm() {
    return algorithm;
  }
}
Run Code Online (Sandbox Code Playgroud)

我有不同的算法

public class Sha1 {
   public static String hash(final String text, final byte[] sb) {...}
}
Run Code Online (Sandbox Code Playgroud)

public class Hmac {
   public static String hash(final String text, final byte[] sb) {...}
}
Run Code Online (Sandbox Code Playgroud)

当有人打电话时,我想返回他们的实例

Algorithm.SHA1.getInstance()
Run Code Online (Sandbox Code Playgroud)

  • 我怎么能返回实例,因为我的方法是静态的?(它是静态的,因此多个线程不能互相播放数据)

das*_*ght 6

当方法是静态的时,您不能返回实例,但是可以使enum实现成为接口,并使调用静态方法的实例方法为您执行虚拟调度:

public interface EncryptionAlgo {
    String hash(final String text, final byte[] sb);
}

public enum Algorithm implements EncryptionAlgo {
    SHA1("sha1") {
        public String hash(final String text, final byte[] sb) {
            return Sha1.hash(text, sb);
        }
    },
    HMAC("hmac") {
        public String hash(final String text, final byte[] sb) {
            return Hmac.hash(text, sb);
        }
    };

    Algorithm(final String algorithm) {
        this.algorithm = algorithm;
    }
    private final String algorithm;

    public String getAlgorithm() {
        return algorithm;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以拨打hashSHA1HMAC实例,就像这样:

Algorithm.HMAC.hash(someText, sb);
Run Code Online (Sandbox Code Playgroud)

或传递EncryptionAlgo实例,如下所示:

EncryptionAlgo algo = Algorithm.SHA1;
Run Code Online (Sandbox Code Playgroud)