有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java定义的列表/对象是空的还是新的?

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

1)获取列表的代码

public List < User > getUsers() {

    List < User > users = null;

    try {

        users = UserDAO.getUsers();

    } catch (Exception e) {

        e.printStackTrace();
    }

    return users;
}

我的问题是,定义列表或对象的最佳方法是什么

  1. List<User> users=null;

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

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

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) 个答案

  1. # 1 楼答案

    案例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

  2. # 2 楼答案

    在你提出的备选方案中,不可能说哪一个“更好”。这取决于当出现异常时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。如果调用者需要知道是否发生了故障,这就是异常的用途


    问题2:

    类似的原则。执行第二种形式的Java 8方法是:

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

    在Java8之前,避免返回null的最佳方法是声明一个表示“无用户”的User实例并返回该实例

    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;
        }
    }
    
  3. # 3 楼答案

    这完全取决于代码的行为。如果试图获取用户列表时产生异常,则需要确定代码行为。如果它应该在空列表中运行,那么您希望使用new ArrayList<>(),但是如果您希望在异常情况下提醒用户或停止程序,那么您应该使用= null,然后使用条件语句来检查这一点