首先我要说的是,我相信不变性是人们可以做的最好的事情之一,可以提高可靠性、简单性并给予人们对系统的信心。不再担心防御性副本或值(value)观改变等,这对我来说是一件好事。
尽管如此,Collections 库的不可修改XXX 方法很简单,但它是一种呈现只读集合的简单方法,这是一件好事,可以保证内容的安全。它并不能解决宇宙中的所有问题,但拥有它是一件好事。
毕竟我正在寻找一个试图修复其他一些问题的库。
只读属性
- r/o 会包装另一个属性
- 扩展 java.util.Properties
- 变异方法抛出 UOE。
- keySet/valueSet View 等也应该是只读的
可变属性
- map(例如 put)方法抛出 UOE
- 只有像 setProperty 这样正确的 Properties 方法才可以工作。
- 扩展 java.util.Properties
对于堆栈也重复属性练习。对 java.util.Date、java.sql.Date 等重复练习
请不要告诉我自己写,因为是的,我可以,但我希望这些无聊的事情已经完成了:)
最佳答案
我认为这样的库不存在。
但是,我不会告诉您自己编写,因为我认为这会浪费时间:
对于
java.util.Date
在这种情况下,请使用 Joda 时间 API,其中基本日期/时间对象是不可变的。对于不可变的
Properties
案例,包裹Properties
不可修改的对象Map
.对于可变的
Properties
案例,使用HashMap<String, String>
而不是Properties
.java.sql.Date
由于 JDBC 方法返回java.sql.Date
,这种情况很难解决。实例。
考虑一下这一点。数以百万计的 Java 程序员多年来一直没有这些 util 类的只读版本。显然没有人认为值得花时间创建/发布这样一个库。这告诉你一些事情吗?也许,这不是一个真正的问题?或者有更好的解决方案(例如 Joda 时间)。
例如,当我编写一个将 Properties 对象传递给某个方法的方法时,我会查看该方法的 API。它是否表示或暗示它修改/可能修改该对象?我关心的?除非这两个问题的答案都是"is",否则我不需要制作防御性副本。如果两个问题的答案都是"is",那么我确实需要制作一个防御性副本……而不可变对象(immutable对象)不是答案。
现在,如果从今天开始从头开始重新设计 Java,那么处理可变对象与不可变对象(immutable对象)的更好方法将成为我议程上的首要任务。但事实并非如此。
但是,嘿,你可以自由地不同意我的观点并实现你自己的库。
关于java - 包含 java.util.Properties、sql.Date、util.Date 等不可修改扩展的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5361826/