Можно ли иметь массив классов в Java? - PullRequest
0 голосов
/ 25 сентября 2019

Можно ли сделать что-то подобное в Java?

class Foo { ... };
class Bar { ... };
class Baz { ... };

Object arr[] = {Foo, Bar, Baz};

Обновление:

Вот чего я стараюсь избегать:

        switch (entity) {
        case "Book":
            switch (action) {
            case "create":
                Book.create();
                break;
            case "read":
                Book.read();
                break;
            case "update":
                Book.update();
                break;
            case "destroy":
                Book.destroy();
                break;
            }
            break;
        case "Author":
            switch (action) {
            case "create":
                Author.create();
                break;
            case "read":
                Author.read();
                break;
            case "update":
                Author.create();
                break;
            case "destroy":
                Author.destroy();
                break;
            }
            break;
        case "Publisher":
            switch (action) {
            case "create":
                Publisher.create();
                break;
            case "read":
                Publisher.read();
                break;
            case "update":
                Publisher.update();
                break;
            case "destroy":
                Publisher.destroy();
                break;
            }
            break;
        }

Кажется, это было бы очень просто сделать в чем-то вроде Ruby:

my_models = [Book, Publisher, Author]

puts "choose a model"
model = # read from stdin
action = #read action from stdin
my_models[model].call_method(action)

Я больше привык к Ruby, чем к Java.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Я хочу, чтобы пользователь мог выбрать число 1-3, а затем найти один из классов в массиве и вызвать статический метод для этого класса.Это кажется обычным явлением в языках сценариев, хотя кажется, что это невозможно в скомпилированном / строго типизированном языке.

Да, возможно запустить статический метод накласс, когда все, что у вас есть, это .class.Вот код, который показывает массив Class объектов с одной записью, а затем вызывает определенный метод для него.Вы должны иметь возможность изменить это так, чтобы оно содержало столько классов, сколько у вас есть, и вызывать любой метод, который вы хотите.

import java.lang.reflect.InvocationTargetException;

public class Example {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class[] classes = new Class[]{A.class};
        classes[0].getMethod("print").invoke(null); // run named method from class in array
    }
}

class A {
    public static void print() {
        System.out.println("static print() method called on: " + A.class);
    }
}

Вот вывод, когда я запускаю это локально:

static print() method called on: class A
0 голосов
/ 25 сентября 2019

Если методы не являются частью общего интерфейса, вы можете создать массив из Runnable функций, которые обертывают вызовы статических методов.Затем просто извлеките функцию-оболочку из массива и run it:

class A {
    static void someStaticMethod(int i) {
        System.out.println(i);
    }
}

class B {
    static void someOtherStaticMethod(String s) {
        System.out.println(s);
    }
}

public class HelloWorld{

     public static void main(String []args){
        Runnable[] funcs = {() -> A.someStaticMethod(1),
                            () -> B.someOtherStaticMethod("2")};

        Runnable chosenF = funcs[1];  // Grab a method call from the array

        chosenF.run();  // And run it. Prints 2
     }
}

Если вам нужен метод для получения или возврата данных, вы можете использовать существующий функциональный интерфейс , которыйсоответствует тому, что вам нужно, или вы можете написать свой собственный.

Возможно, это «злоупотребление» Runnable, поскольку Runnable предназначено для выполнения функций в другом потоке.Здесь все работает нормально, и вы можете написать свою собственную версию, если потребуется.

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