ObjectiveC блокирует эквивалент Java - программирование
Подтвердить что ты не робот

ObjectiveC блокирует эквивалент Java

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

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

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

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

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

4b9b3361

Ответ 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