Java - как вызвать метод соответствующего класса на основе строки, используя шаблон enum / factory - PullRequest
0 голосов
/ 17 января 2020

Да, я прочитал много примеров в сети, но я не нашел способа вызвать метод, основанный на строковом значении. Может быть, я не ищу правильно ... Я написал весь код, но не знаю, как вызвать метод. К вашему сведению: я не хочу использовать 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;
    }

}

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Вы можете перебрать фабричный 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);
    }
}
0 голосов
/ 17 января 2020

Вы можете использовать функцию enof valueOf (), если ваши имена сонантов enum совпадают со строками, используемыми для поиска (вы можете использовать cardName.toUpper ()). Вы также можете создавать объекты для всех типов карт и сохранять их на карте ha sh, а затем искать их. Вы также можете написать некоторый метод fatory, но это будет if-then-else или переключатель внутри

...