如果与给定字符串匹配,如何 return 枚举
How to return Enum if matches with given String
我有下面给出的枚举 class
public enum AlgorithmEnum {
SHA512("RSA", "SHA512", 1), SHA1("RSA", "SHA1", 1), SHA384("RSA", "SHA384", 1);
private String keyAlgorithm;
private String hashAlgorithm;
private Integer key;
private AlgorithmEnum(String keyAlgorithm, String hashAlgorithm, Integer key) {
this.keyAlgorithm = keyAlgorithm;
this.hashAlgorithm = hashAlgorithm;
this.key = key;
}
public String getKeyAlgorithm() {
return keyAlgorithm;
}
public void setKeyAlgorithm(String keyAlgorithm) {
this.keyAlgorithm = keyAlgorithm;
}
public String getHashAlgorithm() {
return hashAlgorithm;
}
public void setHashAlgorithm(String hashAlgorithm) {
this.hashAlgorithm = hashAlgorithm;
}
public Integer getKey() {
return key;
}
public void setKey(Integer key) {
this.key = key;
}
}
我需要像下面这样的方法,它将输入作为字符串和 returns 枚举
public AlgorithmEnum getAlgorithm(String algorithm){
//returns AlgorithmEnum object
}
我会通过传递 "SHA512withRSA" 作为 getAlgorithm 方法的输入来调用上述方法。
我在实现 getAlgorithm 方法方面需要帮助。
假设传递给您的方法的所有字符串值 getAlgorithm()
都以 withRSA
结尾,您可以使用以下方法获取枚举值:
public AlgorithmEnum getAlgorithm(String algorithm) {
return AlgorithmEnum.valueOf(algorithm.substring(0, algorithm.indexOf("withRSA")));
}
你可以有这样的东西:
public static AlgorithmEnum getAlgorithm(final String algorithm)
throws IllegalArgumentException
{
for (final AlgorithmEnum algorithmEnum : AlgorithmEnum.values())
{
if (algorithm.equalsIgnoreCase(String.format("%swith%s", algorithmEnum.getHashAlgorithm(), algorithmEnum.getKeyAlgorithm())))
{
return algorithmEnum;
}
}
throw new IllegalArgumentException("Unknown algorithm: " + algorithm);
}
但是,我不建议使用这种方法。而是使用 2 个不同的参数而不是单个字符串。
您可以检查给定的 String
是否包含与 enum
属性之一匹配的值以及某些 if
语句:
public AlgorithmEnum getAlgorithm(String algorithm) {
if (algorithm.contains("SHA1")) {
return SHA1;
} else if (algorithm.contains("SHA512")) {
return SHA512;
} else if (algorithm.contains("SHA384")) {
return SHA384;
} else {
return null;
}
}
Please note that this will match String
s like "SHA512withoutRSA"
, too...
也许像
这样的方法
public AlgorithmEnum getAlgorithm(String keyAlgorithm, String hashAlgorithm)
会更好。但是,您必须提供两个参数。
我留给你一个例子,说明我是如何处理类似案例的,你可以很容易地根据自己的需要进行调整:
private static Map<Integer, YourEnum> valuesById = new HashMap<>();
private static Map<String, YourEnum> valuesByCode = new HashMap<>();
static {
Arrays.stream(YourEnum.values()).forEach(value -> valuesById.put(value.reasonId, value));
Arrays.stream(YourEnum.values()).forEach(value -> valuesByCode.put(value.reasonCode, value));
}
public static YourEnum getByReasonId(int endReason) {
return valuesById.get(endReason);
}
我有下面给出的枚举 class
public enum AlgorithmEnum {
SHA512("RSA", "SHA512", 1), SHA1("RSA", "SHA1", 1), SHA384("RSA", "SHA384", 1);
private String keyAlgorithm;
private String hashAlgorithm;
private Integer key;
private AlgorithmEnum(String keyAlgorithm, String hashAlgorithm, Integer key) {
this.keyAlgorithm = keyAlgorithm;
this.hashAlgorithm = hashAlgorithm;
this.key = key;
}
public String getKeyAlgorithm() {
return keyAlgorithm;
}
public void setKeyAlgorithm(String keyAlgorithm) {
this.keyAlgorithm = keyAlgorithm;
}
public String getHashAlgorithm() {
return hashAlgorithm;
}
public void setHashAlgorithm(String hashAlgorithm) {
this.hashAlgorithm = hashAlgorithm;
}
public Integer getKey() {
return key;
}
public void setKey(Integer key) {
this.key = key;
}
}
我需要像下面这样的方法,它将输入作为字符串和 returns 枚举
public AlgorithmEnum getAlgorithm(String algorithm){
//returns AlgorithmEnum object
}
我会通过传递 "SHA512withRSA" 作为 getAlgorithm 方法的输入来调用上述方法。
我在实现 getAlgorithm 方法方面需要帮助。
假设传递给您的方法的所有字符串值 getAlgorithm()
都以 withRSA
结尾,您可以使用以下方法获取枚举值:
public AlgorithmEnum getAlgorithm(String algorithm) {
return AlgorithmEnum.valueOf(algorithm.substring(0, algorithm.indexOf("withRSA")));
}
你可以有这样的东西:
public static AlgorithmEnum getAlgorithm(final String algorithm)
throws IllegalArgumentException
{
for (final AlgorithmEnum algorithmEnum : AlgorithmEnum.values())
{
if (algorithm.equalsIgnoreCase(String.format("%swith%s", algorithmEnum.getHashAlgorithm(), algorithmEnum.getKeyAlgorithm())))
{
return algorithmEnum;
}
}
throw new IllegalArgumentException("Unknown algorithm: " + algorithm);
}
但是,我不建议使用这种方法。而是使用 2 个不同的参数而不是单个字符串。
您可以检查给定的 String
是否包含与 enum
属性之一匹配的值以及某些 if
语句:
public AlgorithmEnum getAlgorithm(String algorithm) {
if (algorithm.contains("SHA1")) {
return SHA1;
} else if (algorithm.contains("SHA512")) {
return SHA512;
} else if (algorithm.contains("SHA384")) {
return SHA384;
} else {
return null;
}
}
Please note that this will match
String
s like"SHA512withoutRSA"
, too...
也许像
这样的方法public AlgorithmEnum getAlgorithm(String keyAlgorithm, String hashAlgorithm)
会更好。但是,您必须提供两个参数。
我留给你一个例子,说明我是如何处理类似案例的,你可以很容易地根据自己的需要进行调整:
private static Map<Integer, YourEnum> valuesById = new HashMap<>();
private static Map<String, YourEnum> valuesByCode = new HashMap<>();
static {
Arrays.stream(YourEnum.values()).forEach(value -> valuesById.put(value.reasonId, value));
Arrays.stream(YourEnum.values()).forEach(value -> valuesByCode.put(value.reasonCode, value));
}
public static YourEnum getByReasonId(int endReason) {
return valuesById.get(endReason);
}