Java-如何使用枚举/工厂模式基于字符串调用相应类的方法
是的,我在网上读了很多例子,但我没有找到一种方法来调用基于字符串值的方法。也许我没有用正确的方式寻找。。。我写了所有代码,但不知道如何调用该方法。 仅供参考:我不想使用Java-如何使用枚举/工厂模式基于字符串调用相应类的方法,java,design-patterns,enums,factory-pattern,Java,Design Patterns,Enums,Factory Pattern,是的,我在网上读了很多例子,但我没有找到一种方法来调用基于字符串值的方法。也许我没有用正确的方式寻找。。。我写了所有代码,但不知道如何调用该方法。 仅供参考:我不想使用if-else或开关盒 以下是我想要的: 我从数据库中获取读卡器类型为String。我必须调用相应的类的方法 我的代码: LoginPanel.java public class LoginPanel { public static void main(String args[]) { String re
if-else
或开关盒
以下是我想要的:
我从数据库中获取读卡器类型为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
}
}
public interface ISmartCardReader {
public Integer getCardNumber();
}
public class Omnikey5427G2 implements ISmartCardReader {
public Omnikey5427G2() {
System.out.println("G222222222222222...");
}
public Integer getCardNumber() {
return 222;
}
}
public class Omnikey5427CK implements ISmartCardReader {
public Omnikey5427CK() {
System.out.println("CKKKKKKKKKKKKKKK...");
}
public Integer getCardNumber() {
return 111;
}
}
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;
}
}
ISmartCardReader.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
}
}
public interface ISmartCardReader {
public Integer getCardNumber();
}
public class Omnikey5427G2 implements ISmartCardReader {
public Omnikey5427G2() {
System.out.println("G222222222222222...");
}
public Integer getCardNumber() {
return 222;
}
}
public class Omnikey5427CK implements ISmartCardReader {
public Omnikey5427CK() {
System.out.println("CKKKKKKKKKKKKKKK...");
}
public Integer getCardNumber() {
return 111;
}
}
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;
}
}
Omnikey5427G2.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
}
}
public interface ISmartCardReader {
public Integer getCardNumber();
}
public class Omnikey5427G2 implements ISmartCardReader {
public Omnikey5427G2() {
System.out.println("G222222222222222...");
}
public Integer getCardNumber() {
return 222;
}
}
public class Omnikey5427CK implements ISmartCardReader {
public Omnikey5427CK() {
System.out.println("CKKKKKKKKKKKKKKK...");
}
public Integer getCardNumber() {
return 111;
}
}
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;
}
}
Omnikey5427CK.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
}
}
public interface ISmartCardReader {
public Integer getCardNumber();
}
public class Omnikey5427G2 implements ISmartCardReader {
public Omnikey5427G2() {
System.out.println("G222222222222222...");
}
public Integer getCardNumber() {
return 222;
}
}
public class Omnikey5427CK implements ISmartCardReader {
public Omnikey5427CK() {
System.out.println("CKKKKKKKKKKKKKKK...");
}
public Integer getCardNumber() {
return 111;
}
}
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;
}
}
smartcardenumfactory.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
}
}
public interface ISmartCardReader {
public Integer getCardNumber();
}
public class Omnikey5427G2 implements ISmartCardReader {
public Omnikey5427G2() {
System.out.println("G222222222222222...");
}
public Integer getCardNumber() {
return 222;
}
}
public class Omnikey5427CK implements ISmartCardReader {
public Omnikey5427CK() {
System.out.println("CKKKKKKKKKKKKKKK...");
}
public Integer getCardNumber() {
return 111;
}
}
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;
}
}
如果枚举实例名称与用于查找的字符串匹配,则可以使用枚举的valueOf()函数(可以使用cardName.toUpper()。您还可以为所有卡类型创建对象,并将其存储在哈希映射中,然后进行查找。您也可以编写一些fatory方法,但这将是if-then-else或switch-in您可以迭代工厂的
值()
,并获得与字符串匹配的值:
公共枚举SmactCardenumFactory{
//为简洁起见,省略了当前代码
公共静态getSmartCardReader(字符串名称){
返回Arrays.stream(values())
.filter(r->r.cardReaderName().equals(名称))
.map(SmactCardenumFactory::getInstance();
.orElse(空);
}
}
if(“test”.equals(myString))返回test();else if(“notTest”.equals(myString))返回notTest())差不多probably@Stultuske-我不想使用if else
或开关大小写
您需要实现一个解析系统来将字符串转换为对应的枚举。您可以使用db字符串,去掉连字符,使其全部大写,然后调用SmartCardEnumFactory.valueOf(ModifiedBString)
获取所需的实例,然后调用所需的适当方法。如果需要进行缩放,则需要确定标准,以便编写适当的解析器:确定命名约定,以便编写可缩放的解析器。如果没有约定/标准,则无法确定可能出现的角点情况当新版本发布时,会导致您更新代码。也许您可以将ann注释添加到每个包含自己的字符串表示的类中,然后工厂可以读取这些字符串表示?