Java 8, fonksiyonel arayüzler konseptinin yanı sıra fonksiyonel arayüzler almak için tasarlanmış çok sayıda yeni yöntem ekledi . Bu arayüzlerin örnekleri, yöntem referans ifadeleri (örn. SomeClass::someMethod
) Ve lambda ifadeleri (örn. (x, y) -> x + y
) Kullanılarak kısa bir sürede oluşturulabilir .
Bir meslektaşım ve ben bir formun veya başka bir formun ne zaman kullanılmasının en iyi olduğu konusunda farklı görüşlere sahibiz (bu durumda "en iyisi" gerçekten "en okunabilir" ve "en çok standart uygulamalara uygun" olarak kaybolur, temelde aksi halde eşdeğer). Özellikle, bu aşağıdakilerin doğru olduğu durumu içerir:
- söz konusu işlev tek bir kapsam dışında kullanılmaz
- örneğe bir ad vermek okunabilirliğe yardımcı olur (örneğin, mantığın bir bakışta neler olduğunu görecek kadar basit olması yerine)
- bir formun diğerine tercih edilmesinin başka programlama nedenleri yoktur.
Konuyla ilgili şu anki görüşüm, özel bir yöntem eklemenin ve yöntem referansı ile atıfta bulunmanın daha iyi bir yaklaşım olduğu yönündedir. Özelliğin nasıl kullanılmak üzere tasarlandığı gibi geliyor ve neler olup bittiğini yöntem adları ve imzalarla iletmek daha kolay görünüyor (örneğin, "boolean isResultInFuture (Sonuç sonucu)" açıkça bir boole döndürdüğünü söylüyor). Ayrıca, sınıfta gelecekteki bir geliştirme aynı denetimi kullanmak istiyorsa, ancak işlevsel arabirim sarmalayıcısına ihtiyaç duymuyorsa özel yöntemi daha yeniden kullanılabilir hale getirir.
Meslektaşımın tercihi, arabirimin örneğini döndüren bir yönteme sahip olmaktır (örneğin, "Predicate resultsInFuture ()"). Bana göre bu, özelliğin nasıl tasarlandığı gibi değil, biraz daha hantal görünüyor ve adlandırma yoluyla gerçekten iletişim kurmak daha zor gibi görünüyor.
Bu örneği somutlaştırmak için, farklı stillerle yazılmış aynı kod şöyledir:
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
results.filter(this::isResultInFuture).forEach({ result ->
// Do something important with each future result line
});
}
private boolean isResultInFuture(Result result) {
someOtherService.getResultDateFromDatabase(result).after(new Date());
}
}
vs.
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
results.filter(resultInFuture()).forEach({ result ->
// Do something important with each future result line
});
}
private Predicate<Result> resultInFuture() {
return result -> someOtherService.getResultDateFromDatabase(result).after(new Date());
}
}
vs.
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
Predicate<Result> resultInFuture = result -> someOtherService.getResultDateFromDatabase(result).after(new Date());
results.filter(resultInFuture).forEach({ result ->
// Do something important with each future result line
});
}
}
Bir yaklaşımın daha çok tercih edileceği, dil tasarımcılarının amaçlarıyla daha uyumlu mu yoksa daha okunabilir mi olduğu konusunda resmi veya yarı resmi belgeler veya yorumlar var mı? Resmi bir kaynağı yasaklamak, birinin daha iyi bir yaklaşım olmasının açık nedenleri var mı?
Object::toString
). Bu yüzden sorum, burada yerleştirdiğim bu özel örnek türünde daha iyi olup olmadığı hakkında, birinin diğerinden daha iyi olduğu örneklerin olup olmadığından daha fazla veya tam tersi.