2012-01-17 2 views
0

У меня есть CLAS называется 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); 
} 

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

Другой вопрос: можно ли сделать что-то подобное в JAVA ?:

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

функции, к сожалению, не являются объектами в Java. Однако вы можете взглянуть на «Отражение». –

+0

Посмотрите на шаблон стратегии http://stackoverflow.com/questions/91932/how-does-the-strategy-pattern-work. –

ответ

2

Во-первых, этот подход не совсем корректен. Никогда не используйте == для сравнения объектов. Используйте 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); 
+0

Результат объекта = FunctionInvoker.valueOf (functionName) .invoke (args); Я изменил его на ... invoke (new MyFunctions(), args); Но все же я не могу скомпилировать код. В нем говорится, что метод «invvoke» не определен. –

+0

Он начал работать после включения: public abstract Object invoke (MyFunctions o, Object args); –

1

в 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); 
+0

Он говорит: java.lang.NoSuchMethodException: cpn_logic.MyFunctions.func1 (java.lang.String) \t на java.lang.Class.getMethod (Unknown Source) –

+0

@KlausosKlausos ли ваш класс действительно есть метод 'func1' что принимает аргумент 'String'? Это был просто пример использования API отражения, который нельзя воспринимать буквально. Вы должны адаптировать его для своей собственной программы. – Jesper

1

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

Пример:

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

Для вас вторым вопроса, да это возможно с помощью Java reflection.

1

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

Например:

f.getClass().getDeclaredMethod(p.getFunctionName).invoke(); 
1

I'm не уверен, что этот подход является эффективным. MyFunctions f = new MyFunctions(); if (p.getFunctionName() == "func1") {

No. AFAIK это не будет работать. Вы сравниваете ссылки на String вместо сравнения содержимого.

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

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


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

Вы можете использовать reflection in java, чтобы делать то, что хотите.

1

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

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

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

процесс:

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

Надеется, что вы получили идею :)

Смежные вопросы