我最近发现了一种有趣的方法来创建 Google Guava 中的对象的新实例。和 Project Lombok :隐藏静态创建者方法后面的构造函数。这意味着您不用执行 new HashBiMap()
,而是执行 HashBiMap.create()
。
我的问题是为什么?隐藏构造函数有什么好处?在我看来,这样做绝对没有任何好处,而且它似乎违反了基本的对象创建原则。从一开始你就用 new Object()
创建一个对象,而不是一些 Object.createMe()
方法。这几乎像是为了创建方法而创建方法。
你这样做有什么收获?
最佳答案
您可能更喜欢静态工厂方法而不是公共(public)构造函数的原因有很多。您可以阅读 Effective Java, Second Edition 中的第 1 项进行更长时间的讨论。
- 它允许方法返回的对象的类型与包含该方法的类的类型不同。实际上,返回的类型可以取决于参数。例如,
EnumSet.of(E)
如果 emum 类型的元素很少,而 enum 类型有很多元素,则将返回不同的类型(编辑: 在这种特殊情况下,提高了 enum 没有很多元素的常见情况的性能元素) - 它允许缓存。例如,
Integer.valueOf(x)
默认情况下,如果多次调用相同的值x
,将返回相同的对象实例, 如果x
介于 -128 和 127 之间。 - 它允许您拥有命名构造函数(如果您的类需要许多构造函数,这将很有用)。例如,参见
java.util.concurrent.Executors
中的方法。 . - 它允许您创建一个概念上简单但实际上非常强大的 API。例如,
Collections
中的静态方法隐藏了很多类型。而不是Collections
具有许多静态方法的类,他们可以创建许多公共(public)类,但这对于该语言的新手来说更难理解或记住。 - 对于泛型类型,它可以限制您需要输入的数量。例如,不要输入
List<String> strings = new ArrayList<String>()
在 Guava 你可以做List<String> strings = Lists.newArrayList()
(newArrayList
方法是泛型方法,泛型类型的类型是推断出来的)。
对于 HashBiMap
,最后一个原因可能性最大。
关于java - 在静态创建者方法后面隐藏构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3852144/