我是java新手,对下面的代码有基本疑问。
1)获取清单的代码。
public List < User > getUsers() {
List < User > users = null;
try {
users = UserDAO.getUsers();
} catch (Exception e) {
e.printStackTrace();
}
return users;
}
我的问题是定义List或对象的最佳方法是什么?
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();
最好的方法是什么?为什么?
答案 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'
}
}
注意:
不要抓住Exception
。真不好主意。
不要使用printstacktrace进行日志记录。
返回null
表示失败可能会导致NPE。如果呼叫者需要知道是否存在故障,那么例外情况是什么。
问题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
。