Есть ли другое решение этой проблемы? - PullRequest
0 голосов
/ 13 июля 2020

Мой код должен вызывать метод 1, если ввод равен cat, и метод 2, если ввод равен собаке. Для достижения этого я использовал условие if else, но мне любопытно узнать, можно ли его реализовать другим способом без использования if, switch или функции hashmap в java. Может ли кто-нибудь предложить решение для этого?

if(input.equals("cat")) 
   method1()
else if(input.equals("dog")) 
   method2()

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Кажется, вы ищете реализацию полиморфизма c.

Это возможно с помощью перечислений и функциональных интерфейсов:

class MyClass {
    static void method1() {
        System.out.println("meow");
    }

    static void method2() {
        System.out.println("woof");
    }

    enum MyEnum {
        CAT(MyClass::method1),
        DOG(MyClass::method2);


        private MyEnum(Runnable method) {
            this.runnable = method;
        }

        private final Runnable runnable;

        public void act() {
            System.out.print(name() + ": ");
            this.runnable.run();
        }
    }

    public static void main(String[] args) {
        String[] inputs = {"cat", "dog" };
        for (String input : inputs) {
            MyEnum animal = MyEnum.valueOf(input.toUpperCase());
            animal.act();
        }
    }
}

Будет выведено:

CAT: meow
DOG: woof

Но в любом случае под капотом метод Enum valueOf использует частную карту пакета enumConstantDirectory для получения значения перечисления по имени.

public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                                String name) {
        T result = enumType.enumConstantDirectory().get(name);
// ...
}
0 голосов
/ 13 июля 2020

Почему бы не использовать отражение?

import java.util.*;
import java.lang.*;
import java.io.*;
import java.lang.reflect.*;

class Ideone
{
    public static void cat(){
        System.out.println("meow");
    }
    
    public static void dog(){
        System.out.println("bark");
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        Method m = Ideone.class.getDeclaredMethod("cat");
        m.invoke(Ideone.class);
        m = Ideone.class.getDeclaredMethod("dog");
        m.invoke(Ideone.class);
    }
}

Для начала fr agile, и если вы используете пользовательский ввод, вы только что открыли каждый метод publi c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...