将 java.sql.Date 类型的对象分配给 java.util.Date 类型的变量是否安全?
Is it safe to assign an object of type java.sql.Date to a variable of java.util.Date?
在我们的数据库访问层中,我们使用数据类型 java.sql.Date
来表示 DATE
列,而在我们的 bean 中,我们使用 java.util.Date
(这是一个遗留应用程序) .
由于 java.sql.Date
扩展了 java.util.Date
,像这样在 bean 中设置我们从 DB 层获取的 java.sql.Date
对象是否安全?
java.sql.Date sqlDate;
// bean.setValidFrom(java.util.Date validFrom)
bean.setValidFrom(sqlDate);
代码编译得很好。
不,不安全。即使 java.sql.Date extends java.util.Date
,它也不是正确的 sub-type,因为它不是行为子类型。下面的示例显示了这两种类型的不同行为:
// 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 的情况好多了。
在我们的数据库访问层中,我们使用数据类型 java.sql.Date
来表示 DATE
列,而在我们的 bean 中,我们使用 java.util.Date
(这是一个遗留应用程序) .
由于 java.sql.Date
扩展了 java.util.Date
,像这样在 bean 中设置我们从 DB 层获取的 java.sql.Date
对象是否安全?
java.sql.Date sqlDate;
// bean.setValidFrom(java.util.Date validFrom)
bean.setValidFrom(sqlDate);
代码编译得很好。
不,不安全。即使 java.sql.Date extends java.util.Date
,它也不是正确的 sub-type,因为它不是行为子类型。下面的示例显示了这两种类型的不同行为:
// 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 的情况好多了。