ObjectiveC блокирует Java-эквивалент - PullRequest
17 голосов
/ 03 апреля 2012

Есть особенность языка Apple Objective-C, которая мне действительно полезна: я могу передавать блоки кода в качестве аргумента в методах.

Я бы хотел сделать это и на Java. Что-то вроде:

myManager.doSomethingInTransaction(function() {
   dao.save();  
});

Таким образом, объект myManager выполнит мой код между методами startTransaction () и endTransaction ().

Есть ли способ получить это на Java?

Ответы [ 4 ]

41 голосов
/ 03 апреля 2012

К сожалению, Java не поддерживает это.Но вы можете получить аналогичную функциональность с анонимными классами.

Для этого сначала вы определяете интерфейс:

interface TransactionAction {
    public void perform();
}

doSomethingInTransaction затем следует определить, чтобы принять TransactionAction в качествеАргумент.

Затем, когда вы его вызываете, сделайте так:

myManager.doSomethingInTransaction(new TransactionAction() {
    public void perform() {
        dao.save();
    }
});
12 голосов
/ 03 апреля 2012

Нет, этого не существует в Java (пока).Обходной путь должен использовать интерфейс Runnable:

myManager.doSomethingInTransaction(new Runnable() {
    public void run() {
        dao.save();  
    }
});

или любой интерфейс с одним методом подойдет.

3 голосов
/ 03 апреля 2012

вы можете использовать интерфейс типа

interface CodeBlock {
    void execute();
}

функция будет выглядеть как

someType functionToBeExecuted(CodeBlock cb) {
    ...
}

она будет вызываться как

functionToBeExecuted(new CodeBlock() {
   void execute() {
       // blah
   }
});

Но если ваш коддолжен иметь возможность доступа к переменным или полям в более специализированной.Также производительность будет ниже из-за новых объектов.

2 голосов
/ 09 января 2016

Это теперь возможно в Java 8 с использованием лямбда-выражения:

myManager.doSomethingInTransaction(() -> {
    dao.save();  
});

Или, более кратко:

myManager.doSomethingInTransaction(() -> dao.save());

Ваша реализация doSomethingInTransaction должна принимать параметр Runnableили любой другой интерфейс с одним методом с соответствующей сигнатурой метода.

Документацию Oracle можно найти здесь: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

...