7

什么是在这里使用的好模式?

我不想返回空值,那感觉不对。

另一件事是,如果我想返回导致它为空的原因怎么办?如果调用者知道它为什么为空,它可以做一些额外的事情,所以我希望调用者知道它并以这种方式行事

Public CustomerDetails getCustomerDetails(){
   if(noCustomer){    
     ..log..etc..
     return null;
   }

   if(some other bad weird condition){    
     ..log..etc..
     return null;
   }

   CustomerDetails details= getCustomerDetailsFromSomewhere();

   if (details!=null){
      return details;
   }
   else {
     ..log..etc..
     return null;
   }

}
4

7 回答 7

8

我认为你有3个主要选择:

  • 如果 null 是有效状态,我认为返回 null 没有问题
  • 如果 null 是无效状态,则应抛出异常
  • 或者使用Null 对象模式

如果您使用的是 googles Guava 库,您也可以使用Optional类。

于 2012-12-27T10:07:13.010 回答
3

Java 中更自然的方法是在错误条件下抛出异常。

public CustomerDetails getCustomerDetails(){
   if(noCustomer){    
     ..log..etc..
     throw new NoSuchCustomer(customerName);
   }

   if(some other bad weird condition){    
     ..log..etc..
     throw new IllegalStateException("some other bad weird condition occurred");
   }

   CustomerDetails details= getCustomerDetailsFromSomewhere();

   if (details==null)
      throw new IllegalStateException("Failed to get customer details for "+ customerName);

   return details;
}

该方法getCustomerDetailsFromSomewhere()可以抛出异常而不是返回 null。

于 2012-12-27T10:21:37.303 回答
1

试试番石榴的可选。请参阅这篇关于避免 null 的文章:http ://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained

于 2012-12-27T10:05:55.780 回答
1

使用谷歌番石榴可选

这会有所帮助。

程序员使用 null 的许多情况是为了表示某种缺失:可能存在值、没有值或找不到值。例如,当没有找到某个键​​的值时,Map.get 返回 null。

Optional 是一种用非空值替换可为空的 T 引用的方法。Optional 可能包含非空 T 引用(在这种情况下,我们说引用是“存在的”),或者它可能不包含任何内容(在这种情况下,我们说引用是“不存在的”)。从来没有说它“包含空值”。

Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5
于 2012-12-27T10:07:09.280 回答
1

你可以试试;

CustomerDetails details = setDetailsToEmpty();

或一些等价物。

您仍然需要检查空客户详细信息或空客户详细信息。

于 2012-12-27T10:08:04.343 回答
1

如果您真的不希望 null 创建一个特殊的 CustomerDetails 对象

...
        public static final CustomerDetails EMPTY_CUSTOMER_DETAILS = new CustomerDetails();
...    
        public CustomerDetails getCustomerDetails(){
            ...
            if (details!=null){
                return details;
            }
            ...
            return EMPTY_CUSTOMER_DETAILS;
于 2012-12-27T10:12:36.387 回答
1

如果您的意思是null不解释其状态,您可以CustomerDetails使用另一个可以提供更多详细信息的类进行包装。例如:

class Feedback()
{
    private CustomerDetails result;
    private int status;

    public static final int STATUS_OK = 0;
    public static final int STATUS_NULL = 1;
    public static final int STATUS_NO_CUSTOMER = 2;
    public static final int STATUS_BAD_CONDITION = 3;

    public Feedback(CustomerDetails result, int status)
    {
        this.result = result;
        this.status= status;
    }

    public CustomerDetails getResult(){return result;}
    public int getStatus(){return status;}
}

并更改您的方法:

Public Feedback getCustomerDetails()
{
   if(noCustomer)
   {
       ..log..etc..
       return new Feedback(null, Feeback.STATUS_NO_CUSTOMER);
   }

   if(some other bad weird condition)
   {
       ..log..etc..
       return new Feedback(null, Feeback.STATUS_BAD_CONDITION);
   }

   CustomerDetails details = getCustomerDetailsFromSomewhere();

   if(details != null)
   {
        return new Feedback(details, Feeback.STATUS_OK);
   }
   else
   {
       ..log..etc..
       return new Feedback(null, Feeback.STATUS_NULL);
   }
}

然后您可以通过 获取状态feedback.getStatus()

于 2012-12-27T10:15:11.533 回答