2014-04-21 32 views
8

kompakt koduna iyi yolu şuna benzer:Temiz kodu - Ben koduna sahip Java

Nasıl bu kod tekrarını önleyebilirsiniz

for(int i=0; i < a; i++){ 
     List<Integer> list = elementA.get(i); 
     SomeClass rg = new SomeClass(list, a, methodA(i)); 
     int result = rg.generate(); 
     var+=methodA2(i, result); 
    } 
    for(int i=0; i < b; i++){ 
     List<Integer> list = elementB.get(i); 
     SomeClass rg = new SomeClass(list, b, methodB(i)); 
     int result = rg.generate(); 
     var+=methodB2(i, result); 
    } 
? Bunu yapan işlevi yaratabilirim, ancak bu farklı yöntemlerle ne yapmalıyım?

interface IntFunction<A> { A apply (int i); } 

m(elementA, a, new IntFunction<A>() { public A apply(int i) { methodA(i); } }); 

Ve yöntemi gibi görünecektir::

private void m(Collection<List<Integer>> element, int a, IntFunction<A> f) { 
    for(int i=0; i < a; i++){ 
     List<Integer> list = element.get(i); 
     SomeClass rg = new SomeClass(list, a, f.apply(i)); 
     int result = rg.generate(); 
    } 
} 

(I Eğer bir arabirim oluşturabilir Java < 8 ile

+0

Bu elementa ve elementB, Yöntemia ait() ve Yöntemib() beyanlarına bağlıdır ve methodA2() ve methodB2 ait(). Sınıfların get() yöntemleri ortak bir arabirim veya üst sınıf tarafından tanımlanmışsa, bu yardımcı olur. Yöntemlere gelince, onlar hakkında daha fazla bilgi sahibi olmalıyız - bir şekilde get() ile sınıflara karşılık mı geliyorlar? – arcy

cevap

10

(orada zaten Java 8'de bir IntFunction arayüz olduğunu unutmayın) özlülük için methodA2 atladık: oldukça ettik olduğunu Bu bir apply(int, int))

sahip ikinci bir arayüz gerekir Rbose ve yarar tekrar tekrar değil bariz değildir.


Java 8 sayesinde daha temiz hale gelir:

m(elementA, a, i -> methodA(i)); 
//or 
m(elementA, a, this::methodA); 
+1

@ ᴋᴇʏsᴇʀ Daha ayrıntılı bir örnek ekledim. – assylias

+1

"IntFunction" arabiriminin [Java 8'de zaten var] olduğuna dikkat edin (http://docs.oracle.com/javase/8/docs/api/java/util/function/IntFunction.html). –

+0

@BoristheSpider Evet Adı bilerek seçtim! – assylias

1
  • istenen verileri döndürür senin List<List<Integer>> olarak argüman alan bir yöntem tanımlayın.
  • (kodunuzdan alınarak) method, method2 gibi jenerik yöntemleri yapacak bir arabirim tanımlar. Örneğin

:

public long yourFooMethod(List<List<Integer>> listOfData, int n, SomeInterface foo) { 
    int i = 0; 
    long var = 0; 
    for(List<Integer> list : listOfData) { 
     SomeClass rg = new SomeClass(list, n, foo.method(i)); 
     int result = rg.generate(); 
     var += foo.method2(i, result); 
    } 
    return var; 
} 
İlgili konular