当前位置: 首页 > 面试题库 >

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

邹杰
2023-03-14
问题内容

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

我的问题是为什么?隐藏构造函数有什么好处?在我看来,这样做绝对没有优势,而且似乎违反了基本的对象创建原则。由于开始时您使用new Object()而不是某种Object.createMe()方法创建对象。这似乎是为了创建方法而创建方法。

您从中得到什么?


问题答案:

有许多原因导致您可能更喜欢静态工厂方法而不是公共构造函数。您可以阅读《有效Java,第二版》中的项目1,以进行更长时间的讨论。

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

对于HashBiMap,最后一个原因是最有可能的。



 类似资料:
  • 问题内容: 我正在学习“ 有效的Java” ,书中并未建议我认为一些标准的东西,例如对象的创建,我的印象是构造函数是最好的方法,书中说我们应该利用在静态工厂方法中,我不能说出一些优点,而在缺点中却有缺点,所以我在问这个问题,这是使用它的好处。 优点: 静态工厂方法的一个优点是,与构造函数不同,它们具有名称。 静态工厂方法的第二个优点是,与构造函数不同,不需要每次调用它们时都创建一个新对象。 静态工

  • 问题内容: 什么时候应该使用构造函数,什么时候应该使用静态方法? 您能用小片段解释一下吗?我略读了一些线程,但是我仍然不清楚。 问题答案: 当您只想返回该类型的新对象并且希望简单时,请使用公共构造函数。 一个很好的例子是StringBuilder,因为它是可变的,您可能每次都想要一个新对象。 当您可能想重用对象(尤其是不可变的对象),返回子类或描述结构时,请使用静态因子方法。一个很好的例子是Enu

  • Javassist的API似乎允许我们创建类中声明的类初始值设定项(即静态构造函数)的精确副本: 但是,该副本还包括(公共/私有)静态最终字段。例如,以下类的静态构造函数: 事实上是: 因此,静态构造函数的精确副本也将包括对最终字段“名称”的调用。 有没有办法创建不包含对final字段的调用的静态构造函数的副本? --谢谢

  • 当我试着运行这段代码时,它给了我30。有人能解释一下吗!我知道在Java中不能重写静态方法,因为多态性和静态方法不能一起工作。静态方法在类上调用,而不是在实例中调用。但有人能就这个话题做进一步解释吗。我真的不明白为什么我的分数是30而不是10。谢谢

  • 我是新爪哇,目前正在大学读一门课程。我们使用Java编程早期对象作为课程文献。我有一个关于新对象构造函数的问题。这本书非常明确地指出,“即使这样做是可能的,也不要从构造函数调用方法。” 这是所有的方法吗,句号?我理解从构造函数调用类自己的实例方法的问题。但是帮手方法等? 这可以接受吗?如果没有,我想你不能在构造函数中使用任何Java数学util函数或类似的东西?

  • 本文向大家介绍C#静态构造函数?相关面试题,主要包含被问及C#静态构造函数?时的应答技巧和注意事项,需要的朋友参考一下 最先被执行的构造函数,且在一个类里只允许有一个无参的静态构造函数 执行顺序:静态变量>静态构造函数>实例变量>实例构造函数