Назначьте правильную функцию для объекта класса - PullRequest
0 голосов
/ 17 января 2012

У меня есть класс, называемый MyFunctions, который определяет различные функции func1, func2 и т. Д. Также у меня есть класс Process, в котором хранится имя функции, присвоенное объекту этого класса:

Process p1 = new Process();
String fName1 = "func1";
p1.setFunctionName(fName1); 
Process p2 = new Process();
String fName2 = "func2";
p2.setFunctionName(fName2); 

Чтобы запустить правильную функцию, я делаю следующее:

MyFunctions f = new MyFunctions();
if (p.getFunctionName() == "func1") {
   output = f.func1(inputdata);
} else if (p.getFunctionName() == "func2") {
   output = f.func2(inputdata);
}

Я не уверен, что этот подход эффективен. Есть ли другой способ решить эту задачу?

Еще один вопрос: возможно ли сделать что-то подобное в JAVA ?:

String fName = p.getFunctionName();
output = f."+fName+"(input);

Ответы [ 6 ]

2 голосов
/ 17 января 2012

Во-первых, этот подход не совсем корректен. Никогда не используйте == для сравнения объектов. Используйте equals() вместо:

MyFunctions f = new MyFunctions();
if ("func1".equals(p.getFunctionName())) {
   output = f.func1(inputdata);
} else if ("func2".equals(p.getFunctionName())) {
   output = f.func2(inputdata);
}

Во-вторых, я бы предложил вам использовать enum.

public enum FunctionInvoker {
    func1 {
        public Object invoke(MyFunctions o, Object ... arg) {
             o.func1(arg[0]);
        }
    },
    func2 {
        public Object invoke(MyFunctions o, Object ... arg) {
             o.func2(arg[0], arg[1]);
        }
    },
}

Теперь использование выглядит так:

String functionName = ...; // probably read from file, etc.
Object result = FunctionInvoker.valueOf(functionName).invoke(args);
1 голос
/ 17 января 2012

Используйте перечисление для разделения:

public enum Function {
ONE {
public void call(Functions functions) {
functions.func1();
},
TWO {
...
};

публичный абстрактный вызов void (функции функции); }

Процесс:

Process p1 = new Process(Function.ONE);
MyFunctions f = new MyFunctions();
p1.call(f);

Надеюсь, у вас есть идея:)

1 голос
/ 17 января 2012

Я не уверен, что этот подход эффективен. MyFunctions f = new MyFunctions(); if (p.getFunctionName() == "func1") {

Нет. AFAIK это не будет работать. Вы сравниваете ссылки на строку вместо того, чтобы сравнивать ее содержимое.

if (p.getFunctionName() == "func1") 

используйте .equals вместо == для сравнения 2 строк.


возможно ли сделать что-то подобное в JAVA? output = f."+fName+"(input);

Вы можете использовать отражение в Java , чтобы делать то, что вы хотите.

1 голос
/ 17 января 2012

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

Например:

f.getClass().getDeclaredMethod(p.getFunctionName).invoke();
1 голос
/ 17 января 2012

Если у вас есть определенный набор функций, используйте константы public static для объявления имен функций.

Пример:

public static String FUNCTION1 = "func1";
public static String FUNCTION2 = "func2";

Для вас второй вопрос, да, этовозможно с использованием Java Reflection .

1 голос
/ 17 января 2012

Java Reflection API , скорее всего, будет вам полезен. Это позволяет (помимо прочего) находить методы в классах во время выполнения (когда, например, у вас есть имя метода в строке) и таким образом вызывать методы.

Простой пример:

String inputdata = "Hello";

// Finds the method "func1" in class MyFunctions that takes a String argument
Method method = MyFunctions.class.getMethod("func1", String.class);

// Calls the method on a new MyFunctions object, passing in inputdata
// as the argument
Object result = method.invoke(new MyFunctions(), inputdata);

System.out.println("Return value: " + result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...