Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何使用枚举/工厂模式基于字符串调用相应类的方法_Java_Design Patterns_Enums_Factory Pattern - Fatal编程技术网

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注释添加到每个包含自己的字符串表示的类中,然后工厂可以读取这些字符串表示?