java定义的列表/对象是空的还是新的?
我是java新手,对下面的代码有基本的怀疑
1)获取列表的代码
public List < User > getUsers() {
List < User > users = null;
try {
users = UserDAO.getUsers();
} catch (Exception e) {
e.printStackTrace();
}
return users;
}
我的问题是,定义列表或对象的最佳方法是什么
List<User> users=null;
List<User> users=new List<User>();
最好的方法是什么?为什么
2)类似于以下对象的代码:
public User getUser() {
user user = null;
try {
user = UserDAO.getUser();
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
User user=null;
User user=new User();
最好的方法是什么?为什么
# 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 楼答案
在你提出的备选方案中,不可能说哪一个“更好”。这取决于当出现异常时
getUsers()
/getUser()
的行为需要是什么。这是API设计者和API用户之间的争论。将有意见参与,并讨论效率与可维护性的权衡但在这两个问题上,如果我设计的是API,我会对您的两个备选方案做不同的设计
问题1:
如果我在设计API,我可能会这样写:
如果有必要在getter中处理某些异常,我会这样做:
注:
不要抓住
Exception
。真是个坏主意不要使用printstacktrace登录
返回
null
表示故障可能导致NPE。如果调用者需要知道是否发生了故障,这就是异常的用途问题2:
类似的原则。执行第二种形式的Java 8方法是:
在Java8之前,避免返回
null
的最佳方法是声明一个表示“无用户”的User
实例并返回该实例# 3 楼答案
这完全取决于代码的行为。如果试图获取用户列表时产生异常,则需要确定代码行为。如果它应该在空列表中运行,那么您希望使用
new ArrayList<>()
,但是如果您希望在异常情况下提醒用户或停止程序,那么您应该使用= null
,然后使用条件语句来检查这一点