2012-04-03 8 views
16

Apple Objective-C dilinin benim için gerçekten yararlı olan bir özelliği var: Kod bloklarını yöntemlerde argüman olarak iletebilirim.ObjectiveC blokları Java eşdeğeri

Bunu da Java'da yapmak istiyorum. gibi şey:

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

Yani myManager nesnesi startTransaction() ve bir endTransaction() yöntemleri arasında kodumu çalıştırır.

Java'da bunu elde etmenin bir yolu var mı?

+0

basit cevap "hayır", Java böyle hiçbir işlevselliği olmaması. –

+0

2014 için, cevap "sadece bir Runnable kullanın" gibi görünüyor. – Fattie

cevap

40

Ne yazık ki, Java bunu desteklemiyor. Ancak anonim sınıflarla benzer işlevler alabilirsiniz.

ilk bir arabirim tanımlamak Bunu yapmak için:

interface TransactionAction { 
    public void perform(); 
} 

doSomethingInTransaction sonra bağımsız değişken olarak bir TransactionAction almaya tanımlanmalıdır.

Sonra bunu çağırdığınızda Bunu yapmak:

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

Bu örnek, "yap" anahtar kelimesi olarak çalışmaz. – Landei

+0

Evet, bunu fark ettim. – Taymon

+0

Teşekkür ederim. Bundan daha açık olamaz! :) –

11

Hayır bu Java (henüz) mevcut değildir. yapacak tek bir yöntemle

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

veya herhangi bir arayüz: bir geçici Runnable arayüz kullanmaktır.

Eğer işlevi

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

gibi aranmak Ancak kodunuz erişimi mümkün olmalıdır eğer

someType functionToBeExecuted(CodeBlock cb) { 
    ... 
} 

gibi görünecektir

interface CodeBlock { 
    void execute(); 
} 

gibi bir arabirimi kullanabilirsiniz

+0

Bu en iyi çözüm! –

3

değişkenler veya alanlar daha uzmanlaşmış olacaktır. Ayrıca, yeni nesneler nedeniyle performans bu şekilde daha düşük olacaktır.

2

Bu lambda ifadesi kullanarak Java 8'de artık mümkün: daha tersely

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

Veya:

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

doSomethingInTransaction Sizin uygulaması Runnable parametreyi veya başka herhangi bir tek yöntemi kabul etmelidir eşleşen bir yöntem imzasıyla arabirim.

Burada Oracle'ın belgelerine bulabilirsiniz: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

+2

Bu, hatta 'myManager.doSomethingInTransaction (dao :: save);' için basitleştirilebilir; – Palle