何时以及如何使用构造函数
Foo bar = new Foo();
以及何时以及如何使用getInstance()(静态工厂方法)
Foo bar = Foo.getInstance();
两者有什么区别?我一直使用构造函数,但是什么时候应该使用getInstance()
呢?
每个人似乎都专注于单例,而我认为问题实际上是关于 构造函数与静态工厂方法 。
这实际上是 项目1:考虑静态工厂方法,而不是 Joshua Bloch 的 Effective Java
的构造函数 :
项目1:考虑静态工厂方法而不是构造函数
类允许客户端获取其自身实例的通常方法是提供一个公共构造函数。每个程序员的工具箱中都应该包含另一种技术。一个类可以提供一个公共的 静态工厂方法
,该方法只是返回类实例的静态方法。这是来自的一个简单示例Boolean
(原始类型的装箱原始类型boolean
)。此方法将布尔基本值转换为
Boolean
对象引用:public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; }
请注意,静态工厂方法 与“ 设计模式” [Gamma95,p。1]中的 工厂方法 模式不同。107]。此项中描述的静态工厂方法在“
设计模式”中 没有直接等效的方法。一个类可以向其客户端提供静态工厂方法,而不是构造方法或为构造方法提供补充。提供静态工厂方法而不是公共构造方法具有优点和缺点。
优点(引用本书):
缺点(仍在引用这本书):
问题内容: 有效的Java说“考虑提供静态工厂方法而不是构造函数” 如果你有一个 为类A提供此方法是否有意义,而不是在代码中调用new A()。 问题答案: 请参阅此处以很好地说明您可能要执行此操作的主要原因。综上所述: 命名为“构造函数”。 如果合适,可以返回null。 如果合适,可以返回派生类的实例。 在实例化泛型类型的变量时减少冗长。 我想到了本文没有提及的另一个原因:可以实现有趣的逻辑来避
我在想什么时候使用静态方法?假设我有一个类有几个getter和setter,一两个方法,并且我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法? 示例: ...或: 我很困惑!
问题内容: 我们有一个Hibernate / Spring应用程序,它具有以下Spring Bean: 将应用程序连接在一起时,在hibernate实体中使用私有构造函数时,会出现以下错误: 实体是典型的域对象,例如Employee等。 当将构造函数的可见性修改器更改为打包(或公共)时,应用程序运行良好,并且实体存储/加载到数据库中。我们/如何在Spring / Hibernate事务管理中使用私
问题内容: 我想知道何时使用静态方法?假设我有一个带有几个和的类,一个或两个方法,并且我希望这些方法只能在该类的实例对象上调用。这是否意味着我应该使用静态方法? 例如 要么 我很困惑! 问题答案: 一个经验法则:问自己“即使尚未构建Obj,调用此方法是否有意义?” 如果是这样,那肯定是静态的。 因此,在一个类中,Car你可能有一个静态的方法,因为即使没有人制造过汽车,也可能想知道35mpg转换为什
问题内容: 我想知道何时使用静态方法?假设我有一个带有几个getter和setter的类,一个或两个方法,并且我希望这些方法只能在该类的实例对象上调用。这是否意味着我应该使用静态方法? 例如 要么 (这是静态方式吗?) 我很困惑! 问题答案: 一个经验法则:问自己“即使尚未构建Obj,调用此方法是否有意义?” 如果是这样,那肯定是静态的。 因此,在一个类中,你可能有一个静态的方法,因为即使没有人制
问题内容: 我正在学习“ 有效的Java” ,书中并未建议我认为一些标准的东西,例如对象的创建,我的印象是构造函数是最好的方法,书中说我们应该利用在静态工厂方法中,我不能说出一些优点,而在缺点中却有缺点,所以我在问这个问题,这是使用它的好处。 优点: 静态工厂方法的一个优点是,与构造函数不同,它们具有名称。 静态工厂方法的第二个优点是,与构造函数不同,不需要每次调用它们时都创建一个新对象。 静态工