是的,我在web上读过很多例子,但是我没有找到一种方法来调用基于字符串值的方法。也许我没有以正确的方式寻找..。我编写了所有代码,但不知道如何调用该方法。我不想使用if else或switch case
下面是我想要的:我从数据库中获得读卡器类型为String。我必须调用相应的类的方法。
我的代码:
LoginPanel.java
public class LoginPanel {
public static void main(String args[]) {
String readerType = "Omnikey5427-CK"; // I get this ("Omnikey5427-CK" or "Omnikey5427-G2") from a database as String
// I WANT TO CALL getCardNumber() method of respective class
}
}ISmartCardReader.java
public interface ISmartCardReader {
public Integer getCardNumber();
}Omnikey5427G2.java
public class Omnikey5427G2 implements ISmartCardReader {
public Omnikey5427G2() {
System.out.println("G222222222222222...");
}
public Integer getCardNumber() {
return 222;
}
}Omnikey5427CK.java
public class Omnikey5427CK implements ISmartCardReader {
public Omnikey5427CK() {
System.out.println("CKKKKKKKKKKKKKKK...");
}
public Integer getCardNumber() {
return 111;
}
}SmacrtCardEnumFactory.java
public enum SmacrtCardEnumFactory {
OMNIKEY5427CK("Omnikey5427-CK") {
public ISmartCardReader geInstance() {
return new Omnikey5427CK();
}
},
OMNIKEY5427G2("Omnikey5427-G2") {
public ISmartCardReader geInstance() {
return new Omnikey5427G2();
}
};
private String cardReaderName;
private SmacrtCardEnumFactory(String cardReaderName) {
this.cardReaderName = cardReaderName;
}
public String cardReaderName() {
return cardReaderName;
}
}发布于 2020-01-17 14:19:54
您可以使用枚举的valueOf()函数,前提是您的枚举名称匹配用于查找的字符串(您可以使用cardName.toUpper())。您还可以为所有卡片类型创建对象,并将它们存储在哈希映射中,然后查找它们。您也可以编写一些浮躁的方法,但这将是如果-然后-否则或切换到内部。
发布于 2020-01-17 14:20:08
您可以迭代工厂的values()并获得与字符串匹配的一个:
public enum SmacrtCardEnumFactory {
// current code omitted for brevity
public static getSmartCardReader(String name) {
return Arrays.stream(values())
.filter(r -> r.cardReaderName().equals(name))
.map(SmacrtCardEnumFactory::getInstance();
.orElse(null);
}
}https://stackoverflow.com/questions/59788966
复制相似问题