考虑我有Algorithm
enum
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()
- 我怎么能返回实例,因为我的方法是静态的?(它是静态的,所以多线程不能玩周围与其他数据)
当你的方法是静态的时候你不能返回一个实例,但是你可以让你的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;
}
}
现在可以在SHA1
或HMAC
实例上调用hash
,如下所示:
Algorithm.HMAC.hash(someText, sb);
或传递EncryptionAlgo
实例,如下所示:
EncryptionAlgo algo = Algorithm.SHA1;