java定义列表/对象是null还是new?

时间:2017-03-05 00:45:48

标签: java

我是java新手,对下面的代码有基本疑问。

1)获取清单的代码。

public List < User > getUsers() {

    List < User > users = null;

    try {

        users = UserDAO.getUsers();

    } catch (Exception e) {

        e.printStackTrace();
    }

    return users;
}

我的问题是定义List或对象的最佳方法是什么?

  1. List<User> users=null;

  2. List<User> users=new List<User>();

  3. 最好的方法是什么?为什么?

    2)类似下面的对象代码:

    public User getUser() {
    
        user user = null;
    
        try {
    
            user = UserDAO.getUser();
    
        } catch (Exception e) {
    
            e.printStackTrace();
        }
    
        return user;
    }
    
    1. User user=null;

    2. User user=new User();

    3. 最好的方法是什么?为什么?

3 个答案:

答案 0 :(得分:1)

不可能说哪个更好&#34;你提出的替代方案。这取决于存在异常时getUsers() / getUser() 的行为。这是API设计者和API用户之间的争论。将涉及意见,以及关于效率与可维护性权衡的讨论......

但是在这两个问题中,如果我正在设计API,我会对两种替代方案采用不同的方式。

问题1:

如果我正在设计API,我可能会这样写:

public List <User> getUsers() throws SomeException {
    return UserDAO.getUsers();
}

如果有必要处理getter中的某些异常,我会这样做:

public List <User> getUsers() {
    try {
        return UserDAO.getUsers();
    } catch (SomeException ex) {    // Not 'Exception' !
        // log the exception properly. Not a printStacktrace call!
        return new ArrayList<>();   // Not 'null'
    }
}

注意:

  1. 不要抓住Exception。真不好主意。

  2. 不要使用printstacktrace进行日志记录。

  3. 返回null表示失败可能会导致NPE。如果呼叫者需要知道是否存在故障,那么例外情况是什么。

  4. 问题2:

    类似的原则。 Java 8的第二种形式是:

    public Optional<User> getUser() {
        try {
            return Optional.of(UserDAO.getUser());
        } catch (SomeException ex) {
            // log the exception 
            return Optional.empty();
        }
    }
    

    在Java 8之前,避免返回null的最佳方法是声明一个User实例,表示&#34;没有用户&#34;并返回。

    public static final User NO_USER = new User();  // preferably immutable!
    
    public User getUser() {
        try {
            return UserDAO.getUser();
        } catch (SomeException ex) {
            // log the exception 
            return NO_USER;
        }
    }
    

答案 1 :(得分:0)

这完全取决于代码的行为方式。在尝试获取用户列表生成异常的情况下,您需要确定代码行为应该是什么。如果它应该继续使用空列表,那么你想使用new ArrayList<>()但是如果你想要提醒用户或者在异常中停止程序那么你应该使用= null然后使用条件语句检查一下。

答案 2 :(得分:0)

案例1

List<User> users = null;没有创建任何对象,只是创建了对任何内容的引用。

List<User> users = new ArrayList<User>();正在创建一个对象,在这种情况下是一个空列表。

在您的示例中,您应该使用List<User> users = null;,因为没有理由创建空对象,因为UserDAO.getUsers();已经创建并返回一个对象。

除非您想在发生异常时返回空列表而不是null;在那种情况下,List<User> users = new ArrayList<User>();会有意义。

案例2

User user = null;没有创建任何对象,只是创建了对任何内容的引用。

User user = new User();正在创建一个对象,即User的默认实例。

和以前一样,但在这种情况下,我会说User user = new User();没有多大意义。如果发生异常,可以返回空列表,但我没有理由返回User对象的默认实例,而不是null