ObjectiveC блокирует эквивалент Java
Есть особенность языка Apple Objective-C, который действительно полезен для меня: я могу передавать блоки кода в качестве аргумента в методах.
Я тоже хотел бы сделать это на Java.
Что-то вроде:
myManager.doSomethingInTransaction(function() {
dao.save();
});
Таким образом, объект myManager будет выполнять мой код между методами startTransaction() и endTransaction().
Есть ли способ получить это в Java?
Ответы
Ответ 1
К сожалению, Java не поддерживает это. Но вы можете получить аналогичную функциональность с анонимными классами.
Для этого сначала определите интерфейс:
interface TransactionAction {
public void perform();
}
doSomethingInTransaction
следует определить для принятия a TransactionAction
в качестве аргумента.
Затем, когда вы его вызываете, сделайте следующее:
myManager.doSomethingInTransaction(new TransactionAction() {
public void perform() {
dao.save();
}
});
Ответ 2
Нет, этого не существует в Java (пока). Обходным путем является использование интерфейса Runnable
:
myManager.doSomethingInTransaction(new Runnable() {
public void run() {
dao.save();
}
});
или любой интерфейс с одним методом.
Ответ 3
вы можете использовать интерфейс типа
interface CodeBlock {
void execute();
}
функция будет выглядеть как
someType functionToBeExecuted(CodeBlock cb) {
...
}
он будет называться как
functionToBeExecuted(new CodeBlock() {
void execute() {
// blah
}
});
Но если ваш код должен иметь доступ к переменным или полям, он будет более специализированным. Кроме того, производительность будет ниже из-за новых объектов.
Ответ 4
Теперь это возможно в Java 8 с использованием выражения лямбда:
myManager.doSomethingInTransaction(() -> {
dao.save();
});
Или более коротко:
myManager.doSomethingInTransaction(() -> dao.save());
Ваша реализация doSomethingInTransaction
должна принимать параметр Runnable
или любой другой интерфейс одного метода с сигнатурой метода соответствия.
Здесь вы можете найти документацию Oracle: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html