繁体   English   中英

包含java.util.Properties,sql.Date,util.Date等的不可修改扩展的库

[英]Library that includes Unmodifiable extensions of java.util.Properties, sql.Date, util.Date, etc

首先,我要说的是,不变性是人们可以做的最好的事情之一,可以提高可靠性,简化性并给系统带来信心。 不再担心防御性副本或价值观的变化等对我而言是一件好事。

就是说,尽管Collections库的unmodifiableXXX方法很简单,但却是呈现只读collections的简单方法,这是一件好事,而且可以确保内容安全。 它并不能解决宇宙中的所有问题,但却是一件好事。

毕竟,我追求的是一个试图修复其他疣的图书馆。

只读属性

  • R / O将包装另一个属性
  • 扩展java.util.Properties
  • mutator方法抛出UOE。
  • keySet / valueSet视图等也应该是只读的

可变属性

  • 映射(例如put)方法抛出UOE
  • 只有适当的Properties方法(如setProperty)才可以工作。
  • 扩展java.util.Properties

也会对Stack重复进行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 time)。

例如,当我编写一个将Properties对象传递给某个方法的方法时,我会看一下该方法的API。 它是说还是暗示它修改了/可能修改了对象? 我关心的? 除非答案是对这两个都是“是”,否则我不需要制作防御性副本。 如果两者的答案都是“是”,那么我确实需要进行防御性的复制……而一个不变的对象不是答案。

现在,如果从今天开始从头开始重新设计Java,那么处理可变对象和不可变对象的更好方法将成为我的首要任务。 但这不是。

但是,您可以自由地不同意我并实施自己的库。

当然,您总是可以在对象上调用clone

但是,如果您确实想要只读属性 ,那么使用NetBeans这样的IDE来扩展对象确实很容易。 我可以在10分钟内完成。 迭代器等。 如果您不使用IDE,建议您学习两种最常见的NetBeans或Eclipse。 我使用NetBeans。

如果使用Eclipse,我唯一不知道的是是否可以在Eclipse中创建委托方法。

这是NetBeans的说明。

  1. 创建一个类并扩展属性。 使一个私有变量称为private final Properties backend;
  2. 将构造函数public MyProperties(Properties backend){this.backend=backend;}
  3. 将光标移到构造函数之后,然后输入Alt + Insert 选择背景作为您要委派的对象,然后检查所有方法并继续。
  4. 对于您不希望使用的方法,只需粘贴throw new UnsupportedOperationException("unmodifiable Properties");
  5. keySet和valueSet只需要返回它们现在返回的内容的不可修改的包装器(从第4步开始)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM