2013-09-30 3 views
0

В Java существует ли способ эмулировать функции первого класса в lua и python, например здесь?Java имитирует первоклассные функции

def foo(): 
    print "foo called" 
bar = foo 
bar()  #output from this line is "foo called" 

Или это единственный способ иметь оператор switch с различными методами в каждом случае?

Редактировать: спасибо за разъяснение, я хочу спросить, есть ли способ создать ссылку на функцию и называть ее так, как если бы это была функция.

Кроме того, целью является не вызов определенной реализации функции, она выбирает, какую функцию вызывать, выбор которой может быть совершенно иным. Причина, по которой я хочу сделать это, - это иметь более общий класс, который не нужно редактировать для добавления функциональности. Это похоже на включение функций в коллекцию или список.

Редактировать2: для кого-либо, рассматривающего этот вопрос с целью найти ответ на него: Это касается стеков и кучей. Java не может этого сделать, потому что его методы хранятся в стеке, что намного жестче, чем куча. Однако Python сохраняет свои функции в куче, ссылаясь на них в стеке. Поскольку функции вызывается через ссылку в python, вы можете изменить ссылку на них и использовать по желанию.

+0

Что вы теперь включили? Чаще всего это можно сделать с помощью 'enum'. –

+1

Вот несколько [литература] (http://stackoverflow.com/questions/40480/is-java-pass-by-reference) для вас. – Mena

+2

no, создать интерфейс и реализовать несколько реализаций интерфейса. – jtahlborn

ответ

3

Код в вопросе не демонстрирует поведение при пересылке. На самом деле ни Java, ни Python не имеют семантики pass-by-reference, это все передается по значению.

Что вы демонстрируете - это функции первого порядка: способность рассматривать функцию как любое другое значение. В Java 7 и старше это невозможно, хотя в Java 8 был введен новый синтаксис для анонимных функций (называемый lambdas). Синтаксис лямбда может использоваться для имитации показанного поведения.

0

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

0

(As @ Óscar López только отправил, как я писал это) Что вы делаете сохраняет ссылку на функцию и передает ее по значению.

"Java путь" сделать это было бы использовать интерфейсы:

Интерфейс:

public interface Printer { 
    public void doPrint(); 
} 

Реализация:

public class FooPrinter implements Printer { 
    public void doPrint() { System.out.println("foo"); } 
} 

(Другие реализации можно было бы сделать - BarPrinter, BazPrinter и т. д.)

Вызывающий абонент:

Printer p = new FooPrinter(); 
// presumably some other code here and 
// probably p is passed to another function which accepts Printer (not FooPrinter) 
p.doPrint(); // outputs "foo" 
+0

Моя проблема заключается в том, что я хочу, чтобы программа была шаблоном для разных типов поведения: например. Возможно, я не знаю, что функция называется doPrint, или что doPrint - это функция, которую я хочу вызвать. То, что я знаю, это количество и типы всех параметров и возвратов. По сути, я хочу знать, есть ли реализация возможности изменять функциональные возможности программы во время выполнения на уровне глубже, чем аргументы командной строки и ввод файлов. –

+0

Если вы знаете аргументы и тип возвращаемого значения - тогда какая разница, что он назвал? Назовите это «doAction» ... –

+0

Но в противном случае, чтобы делать то, что вы хотите на уровне языка, звучит так, будто вы хотите что-то вроде Groovy. –

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