Saya telah membaca di banyak situs Web. Opsional hanya boleh digunakan sebagai jenis pengembalian, dan tidak digunakan dalam argumen metode. Saya berjuang untuk menemukan alasan logis mengapa. Misalnya saya punya sepotong logika yang memiliki 2 parameter opsional. Karena itu saya pikir akan masuk akal untuk menulis tanda tangan metode saya seperti ini (solusi 1):
public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
// my logic
}
Banyak halaman web yang menentukan Opsional tidak boleh digunakan sebagai argumen metode. Dengan mengingat hal ini, saya dapat menggunakan metode tanda tangan berikut dan menambahkan komentar Javadoc yang jelas untuk menentukan bahwa argumen mungkin nol, berharap pengelola masa depan akan membaca Javadoc dan karena itu selalu melakukan pemeriksaan nol sebelum menggunakan argumen (solusi 2) :
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Atau saya bisa mengganti metode saya dengan empat metode publik untuk menyediakan antarmuka yang lebih bagus dan membuatnya lebih jelas p1 dan p2 adalah opsional (solusi 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
}
Sekarang saya mencoba menulis kode kelas yang menggunakan potongan logika ini untuk setiap pendekatan. Saya pertama-tama mengambil dua parameter input dari objek lain yang mengembalikan Optional
s dan kemudian, saya memohon calculateSomething
. Oleh karena itu, jika solusi 1 digunakan, kode panggilan akan terlihat seperti ini:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
jika solusi 2 digunakan, kode panggilan akan terlihat seperti ini:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1.orElse(null), p2.orElse(null));
jika solusi 3 diterapkan, saya bisa menggunakan kode di atas atau saya bisa menggunakan yang berikut (tapi kode ini jauh lebih banyak):
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();
}
}
Jadi pertanyaan saya adalah: Mengapa dianggap praktik yang buruk untuk menggunakan Optional
s sebagai argumen metode (lihat solusi 1)? Sepertinya solusi yang paling mudah dibaca bagi saya dan membuatnya paling jelas bahwa parameter bisa kosong / nol untuk pengelola masa depan. (Saya sadar bahwa perancang yang Optional
dimaksudkan hanya digunakan sebagai tipe pengembalian, tetapi saya tidak dapat menemukan alasan logis untuk tidak menggunakannya dalam skenario ini).
null
?