Jika Anda tidak ingin memfaktor ulang kode dan Anda dapat menggunakan Java 8, Anda dapat menggunakan referensi Metode.
Demo sederhana terlebih dahulu (maafkan kelas dalam statis)
public class JavaApplication14
{
static class Baz
{
private final int _int;
public Baz(int value){ _int = value; }
public int getInt(){ return _int; }
}
static class Bar
{
private final Baz _baz;
public Bar(Baz baz){ _baz = baz; }
public Baz getBar(){ return _baz; }
}
static class Foo
{
private final Bar _bar;
public Foo(Bar bar){ _bar = bar; }
public Bar getBar(){ return _bar; }
}
static class WSObject
{
private final Foo _foo;
public WSObject(Foo foo){ _foo = foo; }
public Foo getFoo(){ return _foo; }
}
interface Getter<T, R>
{
R get(T value);
}
static class GetterResult<R>
{
public R result;
public int lastIndex;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
WSObject wsObject = new WSObject(new Foo(new Bar(new Baz(241))));
WSObject wsObjectNull = new WSObject(new Foo(null));
GetterResult<Integer> intResult
= getterChain(wsObject, WSObject::getFoo, Foo::getBar, Bar::getBar, Baz::getInt);
GetterResult<Integer> intResult2
= getterChain(wsObjectNull, WSObject::getFoo, Foo::getBar, Bar::getBar, Baz::getInt);
System.out.println(intResult.result);
System.out.println(intResult.lastIndex);
System.out.println();
System.out.println(intResult2.result);
System.out.println(intResult2.lastIndex);
// TODO code application logic here
}
public static <R, V1, V2, V3, V4> GetterResult<R>
getterChain(V1 value, Getter<V1, V2> g1, Getter<V2, V3> g2, Getter<V3, V4> g3, Getter<V4, R> g4)
{
GetterResult result = new GetterResult<>();
Object tmp = value;
if (tmp == null)
return result;
tmp = g1.get((V1)tmp);
result.lastIndex++;
if (tmp == null)
return result;
tmp = g2.get((V2)tmp);
result.lastIndex++;
if (tmp == null)
return result;
tmp = g3.get((V3)tmp);
result.lastIndex++;
if (tmp == null)
return result;
tmp = g4.get((V4)tmp);
result.lastIndex++;
result.result = (R)tmp;
return result;
}
}
Keluaran
241
4
nol
2
Antarmuka Getter
hanyalah antarmuka fungsional, Anda dapat menggunakan yang setara.
GetterResult
kelas, pengakses dilucuti untuk kejelasan, memegang hasil dari rantai pengambil, jika ada, atau indeks pengambil terakhir yang dipanggil.
Metode getterChain
ini adalah potongan kode sederhana yang dapat dibuat secara otomatis (atau secara manual jika diperlukan).
Saya menyusun kodenya sehingga blok yang berulang menjadi bukti dengan sendirinya.
Ini bukan solusi yang tepat karena Anda masih perlu menentukan satu kelebihan muatan getterChain
per jumlah getter.
Saya akan merefaktor kode sebagai gantinya, tetapi jika tidak bisa dan Anda menemukan diri Anda menggunakan rantai pengambil panjang sering Anda dapat mempertimbangkan untuk membangun kelas dengan beban berlebih yang mengambil dari 2 menjadi, katakanlah, 10, pengambil.
null
cek sebanyak itu, karenawsObject.getFoo().getBar().getBaz().getInt()
sudah menjadi bau kode. Baca apa itu "Law of Demeter" dan pilih untuk memfaktor ulang kode Anda sesuai dengan itu. Kemudian masalah dengannull
pemeriksaan juga akan hilang. Dan pikirkan tentang menggunakanOptional
.