java - 在静态创建者方法后面隐藏构造函数?

标签 java

我最近发现了一种有趣的方法来创建 Google Guava 中的对象的新实例。和 Project Lombok :隐藏静态创建者方法后面的构造函数。这意味着您不用执行 new HashBiMap(),而是执行 HashBiMap.create()

我的问题是为什么?隐藏构造函数有什么好处?在我看来,这样做绝对没有任何好处,而且它似乎违反了基本的对象创建原则。从一开始你就用 new Object() 创建一个对象,而不是一些 Object.createMe() 方法。这几乎像是为了创建方法而创建方法。

你这样做有什么收获?

最佳答案

您可能更喜欢静态工厂方法而不是公共(public)构造函数的原因有很多。您可以阅读 Effective Java, Second Edition 中的第 1 项进行更长时间的讨论。

  1. 它允许方法返回的对象的类型与包含该方法的类的类型不同。实际上,返回的类型可以取决于参数。例如,EnumSet.of(E)如果 emum 类型的元素很少,而 enum 类型有很多元素,则将返回不同的类型(编辑: 在这种特殊情况下,提高了 enum 没有很多元素的常见情况的性能元素)
  2. 它允许缓存。例如,Integer.valueOf(x)默认情况下,如果多次调用相同的值 x,将返回相同的对象实例, 如果 x介于 -128 和 127 之间。
  3. 它允许您拥有命名构造函数(如果您的类需要许多构造函数,这将很有用)。例如,参见 java.util.concurrent.Executors 中的方法。 .
  4. 它允许您创建一个概念上简单但实际上非常强大的 API。例如,Collections 中的静态方法隐藏了很多类型。而不是 Collections具有许多静态方法的类,他们可以创建许多公共(public)类,但这对于该语言的新手来说更难理解或记住。
  5. 对于泛型类型,它可以限制您需要输入的数量。例如,不要输入 List<String> strings = new ArrayList<String>()在 Guava 你可以做List<String> strings = Lists.newArrayList() (newArrayList 方法是泛型方法,泛型类型的类型是推断出来的)。

对于 HashBiMap ,最后一个原因可能性最大。

关于java - 在静态创建者方法后面隐藏构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3852144/

相关文章:

java - spinner.setAdapter(适配器) 导致 "A resource was acquired at attached stack trace but never released"错误并应用程序强制关闭

javascript - 如何在没有 Node.js/NPM 的情况下将我的 Web 应用程序转换为 Angular 4

java - 带有 PropertyPlaceholderConfigurer bean 的 Spring @Configuration 文件无法解析 @Value 注释

java - 如何将一个 Action 监听器分配给几个按钮?

java - 在 Java 正则表达式中使用 Pattern.MULTILINE

Java获取一组用户名

java - Servlet 的 destroy 方法没有关闭数据库连接,即使我也告诉过它

java - JNLP 启动错误

java - Java 应用程序中的 PKIX 路径构建失败

java - RenameTo 似乎随机失败