Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java定义的列表/对象是空的还是新的?_Java - Fatal编程技术网

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

java定义的列表/对象是空的还是新的?,java,Java,我是java新手,对下面的代码有基本的怀疑 1) 获取列表的代码 public List < User > getUsers() { List < User > users = null; try { users = UserDAO.getUsers(); } catch (Exception e) { e.printStackTrace(); } return users; } Use

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

1) 获取列表的代码

public List < User > getUsers() {

    List < User > users = null;

    try {

        users = UserDAO.getUsers();

    } catch (Exception e) {

        e.printStackTrace();
    }

    return users;
}
  • User=null

  • User User=新用户()


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

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

    不可能说哪个“更好”你提出的备选方案的一部分。这取决于出现异常时要求
    getUsers()
    /
    getUser()
    的行为是什么。这是API设计者和API用户之间的争论。将有意见参与,并讨论效率与可维护性的权衡

    但在这两个问题上,如果我设计的是API,我会对您的两个备选方案做不同的设计


    问题1:

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

    public List <User> getUsers() throws SomeException {
        return UserDAO.getUsers();
    }
    
    在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;
        }
    }
    

    案例1

    列表用户=null并没有创建任何对象,只是创建了一个对空的引用

    List users=new ArrayList()正在创建一个对象,在本例中是一个空列表

    在您的示例中,您可能应该使用
    List users=nullUserDAO.getUsers()将已经创建并返回一个对象

    除非发生异常时要返回空列表而不是
    null
    ;在这种情况下,则
    List users=new ArrayList()是有意义的

    案例2

    User=null并没有创建任何对象,只是创建了一个对空的引用

    User User=新用户()
    正在创建一个对象,即
    用户的默认实例


    与前面相同,但在本例中,我会说
    User User=new User()没有多大意义。如果出现异常,可以返回空列表,但我不认为有理由返回
    User
    对象的默认实例而不是
    null

    请格式化您的问题。另外,请学习缩进代码。您需要花一些时间阅读有关Java风格的内容。。。如果您要让其他人阅读您的代码,
    List users=new List()
    将不会编译(是的,Java已编译!),因为您无法实例化接口,即
    List
    。你是说
    =new ArrayList()
    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'
        }
    }
    
    public Optional<User> getUser() {
        try {
            return Optional.of(UserDAO.getUser());
        } catch (SomeException ex) {
            // log the exception 
            return Optional.empty();
        }
    }
    
    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;
        }
    }