2012-04-03 4 views
16

Apple Objective-C 언어의 기능이 정말 유용합니다. 메소드에서 인수로 코드 블록을 전달할 수 있습니다.ObjectiveC blocks Java equivalent

자바에서도 그렇게하고 싶습니다. 같은 뭔가 :

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

는 그래서 myManager 객체가의 startTransaction()과 endTransaction을() 메소드 사이에 내 코드를 실행합니다.

Java로 가져 오는 방법이 있습니까?

+0

간단한 대답은 "아니오", 자바 같은 더 기능이 없다입니다. –

+0

2014 년 대답은 "그냥 Runnable을 사용하는 것"인 것 같습니다. – Fattie

답변

40

불행히도 Java는이를 지원하지 않습니다. 그러나 익명 클래스를 사용하여 비슷한 기능을 얻을 수 있습니다.

먼저는 인터페이스를 정의, 이렇게하려면 :

interface TransactionAction { 
    public void perform(); 
} 

doSomethingInTransaction는 인수로 TransactionAction을 정의해야합니다.

그런 다음, 당신이 그것을 호출 할 때,이 작업을 수행 :

myManager.doSomethingInTransaction(new TransactionAction() { 
    public void perform() { 
     dao.save(); 
    } 
}); 
+1

'do'는 키워드이므로이 예제는 작동하지 않습니다. – Landei

+0

그래, 그냥 주목했다. – Taymon

+0

고맙습니다. 이것보다 더 명확 할 수는 없습니다! :) –

11

없음이 자바 (아직)에 존재하지 않습니다. 할 것입니다 하나의 방법

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

또는 인터페이스 : 해결 방법은 Runnable 인터페이스를 사용하는 것입니다.

당신은 함수가

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

처럼 호출 할 것입니다하지만 당신의 코드에 액세스 할 수 있어야합니다 경우

someType functionToBeExecuted(CodeBlock cb) { 
    ... 
} 

과 같을 것이다

interface CodeBlock { 
    void execute(); 
} 

같은 인터페이스를 사용할 수 있습니다

+0

이것이 최고의 솔루션입니다! –

3

변수 또는 필드는보다 전문화됩니다. 또한 새 오브젝트로 인해 성능이 이렇게 낮아질 것입니다.

2

이는 람다 식 사용하여 Java 8있게되었습니다 : 더 간결

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

또는 :

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

doSomethingInTransaction의 구현은 Runnable 매개 변수, 또는 다른 어떤 단일 방법을 받아 들여야을 일치하는 메소드 서명을 가진 인터페이스

는 현재 오라클의 설명서를 찾을 수 있습니다 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

+2

이것은'myManager.doSomethingInTransaction (dao :: save);로 단순화 될 수도 있습니다. – Palle