在我们的数据库访问层中,我们使用数据类型java.sql.Date
来表示DATE
列,而在我们的bean中,我们正在使用java.util.Date
(它是一个遗留应用程序)。
由于java.sql.Date
扩展java.util.Date
,如果只设置我们从bean中的数据库层获取的java.sql.Date
对象是否安全?
java.sql.Date sqlDate;
// bean.setValidFrom(java.util.Date validFrom)
bean.setValidFrom(sqlDate);
代码编译得很好。
答案 0 :(得分:3)
否,不安全。即使java.sql.Date extends java.util.Date
,它也不是一个合适的子类型,因为它不是一个行为子类型。这是一个示例,显示了两种类型的行为方式:
// not really a date, but a Date
Date date1 = new Date(0L);
// really a date, but not a Date
java.sql.Date sqlDate = java.sql.Date.valueOf("1970-01-01");
// really a date, but a Date?
Date date2 = sqlDate;
// a Date with time
date1.getHours();
// a Date without time. <-- throws an IllegalArgumentException.
// Wait, exactly *which* argument is illegal?
date2.getHours();
您应该创建一个java.util.Date
类型的新对象,复制值如下:
java.sql.Date dateFromDb;
bean.setValidFrom(new java.util.Date(dateFromDb.getTime()));
幸运的是,使用Java 8,事情变得更好了。