Birçok Web sitesinde okudum İsteğe bağlı bir dönüş türü olarak kullanılmalı ve yöntem bağımsız değişkenlerinde kullanılmamalıdır. Bunun mantıklı bir nedenini bulmak için uğraşıyorum. Örneğin, 2 isteğe bağlı parametreye sahip bir mantık parçam var. Bu nedenle yöntem imzamı bu şekilde yazmanın mantıklı olacağını düşünüyorum (çözüm 1):
public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
// my logic
}
Birçok web sayfası, isteğe bağlı olarak belirtilen yöntem bağımsız değişkenleri olarak kullanılmamalıdır. Bunu göz önünde bulundurarak, aşağıdaki yöntem imzasını kullanabilir ve argümanların boş olabileceğini belirtmek için açık bir Javadoc yorumu ekleyebilirim, gelecekteki koruyucular Javadoc'u okuyacak ve bu nedenle argümanları kullanmadan önce her zaman boş denetimler gerçekleştireceğini umarak :
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Alternatif olarak, daha güzel bir arayüz sağlamak ve daha belirgin p1 ve p2'nin isteğe bağlı olmasını sağlamak için yöntemimi dört genel yöntemle değiştirebilirim (çözüm 3):
public int calculateSomething() {
calculateSomething(null, null);
}
public int calculateSomething(String p1) {
calculateSomething(p1, null);
}
public int calculateSomething(BigDecimal p2) {
calculateSomething(null, p2);
}
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Şimdi her yaklaşım için bu mantık parçasını çağıran sınıfın kodunu yazmaya çalışıyorum. Önce iki giriş parametresini Optional
s döndüren başka bir nesneden alıyorum ve sonra çağırıyorum calculateSomething
. Bu nedenle, çözüm 1 kullanılırsa, çağrı kodu şöyle görünecektir:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
çözüm 2 kullanılırsa, çağıran kod şöyle görünür:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1.orElse(null), p2.orElse(null));
çözüm 3 uygulanırsa, yukarıdaki kodu kullanabilir veya aşağıdakileri kullanabilirim (ancak önemli ölçüde daha fazla kod):
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result;
if (p1.isPresent()) {
if (p2.isPresent()) {
result = myObject.calculateSomething(p1, p2);
} else {
result = myObject.calculateSomething(p1);
}
} else {
if (p2.isPresent()) {
result = myObject.calculateSomething(p2);
} else {
result = myObject.calculateSomething();
}
}
Öyleyse sorum: Optional
s'yi yöntem argümanları olarak kullanmak neden kötü uygulama olarak değerlendiriliyor (bkz. Çözüm 1)? Benim için en okunabilir çözüm gibi görünüyor ve parametrelerin gelecekteki koruyucular için boş / boş olabileceğini en açık hale getiriyor. (Tasarımcıların Optional
yalnızca bir dönüş türü olarak kullanılması amaçlandığını biliyorum, ancak bu senaryoda kullanmamak için mantıklı nedenler bulamıyorum).
null
mi?