【问题标题】:How to return an instance from Enum?如何从 Enum 返回一个实例?
【发布时间】:2015-05-20 02:09:24
【问题描述】:

考虑到我有 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()

问题

  • 由于我的方法是静态的,如何返回实例? (它是静态的,所以多个线程不能互相玩弄数据)

【问题讨论】:

  • 为了使其线程安全 - 使用同步怎么样?
  • 添加 getAlgorithm() 方法的方法相同,您也可以添加 getInstance() 方法。您可以在 Enum 或不同的密码上实现它。 SHA1("sha1") { X getInstance() { return new Sha1(); }, Hmac("hmac") { X getInstance() { return new Hmac(); }(但这对静态方法没有多大帮助——无论如何这不是一个好主意)。

标签: java enums


【解决方案1】:

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

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;

【讨论】:

  • 好吧,Algorithm 可以包含 Sha1Hmac 的静态实例并返回一个或另一个,假设这两个类都实现了 EncryptionAlgo界面。但是让Algorithm 自身 实现接口似乎更好,因为它避免了调用getInstance() 的需要。一个 enum 实例已经是一个静态单例,所以使用一个只是为了查找 另一个 静态单例。
  • 另外,SHA1 和 HMAC 是哈希函数,不是加密算法。 EncryptionAlgo 接口最好命名为 HashFunction
  • 您实际上并不需要该接口。您可以直接在枚举类型上使用该方法。
猜你喜欢
  • 2023-03-18
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多