java - 如何从 Enum 返回一个实例?

标签 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;
  }
}

我有不同的算法

public class Sha1 {
   public static String hash(final String text, final byte[] sb) {...}
}

public class Hmac {
   public static String hash(final String text, final byte[] sb) {...}
}

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

Algorithm.SHA1.getInstance()

问题

  • 既然我的方法是静态的,我该如何返回实例? (它是静态的,因此多个线程不能互相玩弄数据)

最佳答案

当你的方法是静态的时候你不能返回一个实例,但是you can make your enum implement an interface ,并让调用静态方法的实例方法为您执行虚拟分派(dispatch):

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

现在您可以在 SHA1HMAC 实例上调用 hash,如下所示:

Algorithm.HMAC.hash(someText, sb);

或者传递 EncryptionAlgo 实例,像这样:

EncryptionAlgo algo = Algorithm.SHA1;

关于java - 如何从 Enum 返回一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30339122/

相关文章:

c++ - 如何 std::map<enum class, std::string>?

sql - 在基于 SQL 的应用程序中 self 记录 "codes"的最佳方法是什么?

c - 枚举数中 'four' 的值是多少?

objective-c - 从混合语言项目中的枚举元素初始化一个 NSNumber

java - SoapUI 找不到我的网络服务

java - 如何保留 XML 标签但删除 HTML 标签

java - 进行网络连接模拟,以避免使用互联网的程序在拨号连接暂时关闭后断开连接

Java notify() 在 wait() 之前运行?

java - 使用不同数据集的参数化 android 测试

enums - Dart 枚举编译器错误