首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -如何使用枚举/工厂模式调用基于字符串的相应类的方法

Java -如何使用枚举/工厂模式调用基于字符串的相应类的方法
EN

Stack Overflow用户
提问于 2020-01-17 14:05:43
回答 2查看 155关注 0票数 1

是的,我在web上读过很多例子,但是我没有找到一种方法来调用基于字符串值的方法。也许我没有以正确的方式寻找..。我编写了所有代码,但不知道如何调用该方法。我不想使用if elseswitch case

下面是我想要的:我从数据库中获得读卡器类型为String。我必须调用相应的类的方法。

我的代码:

LoginPanel.java

代码语言:javascript
复制
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

代码语言:javascript
复制
public interface ISmartCardReader {

    public Integer getCardNumber();

}

Omnikey5427G2.java

代码语言:javascript
复制
public class Omnikey5427G2 implements ISmartCardReader {

    public Omnikey5427G2() {
        System.out.println("G222222222222222...");
    }

    public Integer getCardNumber() {
        return 222;
    }
}

Omnikey5427CK.java

代码语言:javascript
复制
public class Omnikey5427CK implements ISmartCardReader {

    public Omnikey5427CK() {
        System.out.println("CKKKKKKKKKKKKKKK...");
    }

    public Integer getCardNumber() {
        return 111;
    }
}

SmacrtCardEnumFactory.java

代码语言:javascript
复制
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;
    }

}
EN

回答 2

Stack Overflow用户

发布于 2020-01-17 14:19:54

您可以使用枚举的valueOf()函数,前提是您的枚举名称匹配用于查找的字符串(您可以使用cardName.toUpper())。您还可以为所有卡片类型创建对象,并将它们存储在哈希映射中,然后查找它们。您也可以编写一些浮躁的方法,但这将是如果-然后-否则或切换到内部。

票数 0
EN

Stack Overflow用户

发布于 2020-01-17 14:20:08

您可以迭代工厂的values()并获得与字符串匹配的一个:

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59788966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档