java定义的列表/对象是空的还是新的?
我是java新手,对下面的代码有基本的怀疑 1) 获取列表的代码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
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=null因为没有理由创建空对象,因为UserDAO.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;
}
}