我想从API中检索出现在类内的字段。 是的我知道这违反了得墨忒耳法,但我没有任何选择。
实施例
getClassA().getClassB().getClassC().getClassD().getAccountId();
所以要添加null check作为它的坏代码味道,所以我带来下面的代码:
try{
getClassA().getClassB().getClassC().getClassD().getAccountId();
}catch(NullPointerException ex){
S.O.P("Null Found");
}
或
ClassA a = getClassA();
if(a!=null){
ClassB b = a.getClassB();
So on.....
}
我的问题是最好的方法是上面提到的或者显式检索每个类并检查null并转到下一级 这违反了德米特法则
答案 0 :(得分:2)
Null对象设计模式是通过Optional类在Java 8中被吸收的方式,这意味着你有一个包装器,你可以在其中拥有数据或者你有空数据。
类似
MyObject
RealObject NullObject
在不传递null的情况下,传递NullObject,它提供与MyObject相同的接口(可以是具体/抽象/接口类)
答案 1 :(得分:2)
这需要Java 8,你是对的。我认为这将在Guava中以类似的方式发挥作用。
public class OptionalTest {
public static void main(String[] args) {
A a = new A();
Optional<A> opa = Optional.ofNullable(a);
int accid = opa.map(A::getClassB).map(A.B::getClassC).map(A.B.C::getClassD).map(A.B.C.D::getAccountID).orElse(-1);
if (accid > -1) {
System.out.println("The account id is: " + accid);
} else {
System.out.println("One of them was null. Please play with commenting.");
}
}
static class A {
B b = new B();
//B b = null;
B getClassB() {
return b;
}
static class B {
//C c = new C();
C c = null;
C getClassC() {
return c;
}
static class C {
D d = new D();
//D d = null;
D getClassD() {
return d;
}
static class D {
private final int accountId = 2;
int getAccountID() {
return accountId;
}
}
}
}
}
}