`
小小黑咖啡
  • 浏览: 11325 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

第一条 考虑用静态工厂方法代替构造器

阅读更多
第一条 考虑用静态工厂方法代替构造器

静态工厂方法非设计模式中的静态工厂方法,它通过是static的静态方法生产相关的类的方法,例如:Integer i = Integer.valueOf(1);他就是将1封装成Integer类的1(可能不说的不太对,大概因该是这个意思)
当然也可写为Integer i = new Integer(1);
写个最简单的代码演示下静态工厂:
public static Boolean valueOf(boolean b) {
		return b ? Boolean.TRUE : Boolean.FALSE;
	}


但书中写了4条方法写了静态工厂的优势:
(1)静态工厂方法与构造器不同的第一大优势在于,它们有名称。
根据不同需求可以起名为valueOf、getInstance、newInstance、getType、newType等等
(2)不必在每次调用它们的时候都创建一个新的对象
如果累世不可变类或者是singleton的类或者不可实例化的类,使用静态工厂方法要比每次new个对象来得好得多(还有一点我不是太懂,书上原话是“它还使不可变的类(15条)可以确保不会存在两个相等的实例,即当且仅当a==b的时候才有a.equals(b)为true,如果类保证了这一点,他的客户端就可以使用==操作符来代替equals(Object)方法,这样可以提高性能,枚举(enum)类型(30条)保证了这一点”)
(3)他们可以返回类型的任何子类型的对象
用户可以定义返回类型,我们不必一定返回一个类,我们可以返回一个它实现的一个接口,在以后的如果想废弃这个类换成其他的类,更换计较方便,举个不恰当的例子,例如:List l = new ArrayList();如果不想用ArrayList想用LinkList,只要修改一个地方就行了,有点像接口编程。!
(4)它们使代码变得更加简洁
Map<String, List<String>> m = new HashMap<String, List<String>>;
Map<String, List<String>> m = HashMap.newInstance();
二者谁简单一眼就知道了

当然静态工厂也有缺点:
(1)类如果不含共有的或者受保护的构造器,就不能被子类化
(2)它们与其他的静态方法实际上没有区别

总之静态工厂和构造器各有所长,在提供类的实例时,切记不可忘记静态工厂。

本人能力有限,可以说是小菜鸟,看完的东西,解释出来肯定有不正确的,或者与真实有出入的,希望大神们有时间的话留言改正,再次谢过
分享到:
评论

相关推荐

    Effective-Java读书笔记(上)

    ##### 用静态工厂方法代替构造器 在面向对象编程中,对象的创建通常是通过构造器来完成的。然而,在某些情况下,使用静态工厂方法来创建对象可能会更加灵活和高效。 **静态工厂方法的优势**: 1. **命名清晰**:...

    java effective 第二版中英文二份文件

    4. **使用静态工厂方法代替构造器**:静态工厂方法不需创建新类实例,可以返回之前创建的对象,实现单例模式或返回不可变对象。此外,它们无需在类声明时就确定,可以有更具表达力的名字。 5. **考虑用私有构造器或...

    Effective Java第三版1

    1. **静态工厂方法**:相比构造器,静态工厂方法有优点如可以不返回新实例、允许返回同一实例(单例)、可以有更具选择性的访问控制,并且命名更自由。 2. **构建器(Builder pattern)**:当类有多个构造器参数时,...

    现代编程语言- Kotlin 之美 - 当下最火的编程语言欣赏.pdf

    #### EJ 第1条:考虑使用静态工厂方法代替构造器 在实例化对象的过程中,静态工厂方法相较于构造器具有明显的优势。这些优势不仅限于易于理解和避免不必要的对象创建,还包括能够灵活地返回原类型的任何子类型。...

    effectice_java第二版 英文

    2. **条目2:考虑为静态工厂方法而不是构造器(Consider Static Factory Methods Instead of Constructors)** 静态工厂方法有命名灵活性,不需创建新类就能返回实例,还可以返回原类型的子类型,或者在不需要时...

    Effective.Java3rd.zip

    9. **优先考虑静态工厂方法而非公共构造器**:静态工厂方法提供了更灵活的无状态类创建方式,例如,它们可以返回已存在的对象以节省资源。 10. **使用枚举代替常量类**:枚举不仅可以存储常量,还可以定义行为,比...

    javaCore_Logic

    - **方法**:阐述了如何设计高效的方法,包括避免过早优化,以及使用静态工厂方法代替构造器等。 2. **Java编程的逻辑.pdf** 这本书可能侧重于帮助开发者理解和掌握Java编程的基本逻辑和思维方法,包括: - **...

    【05-面向对象(下)】

    我们把该类的构造器使用Private修饰,从而把该 类的所有构造器隐藏起来。  –2.则需要提供一个public方法作为该类的访问点,用于创建该类的对象,且必须使用static修饰  –3.该类还必须缓存已经创建的对象,必须...

    effecctivejava 第三版中文

    1. **构造器与工厂方法**:书中强调,类的构造器应该简洁且易于理解,同时推荐使用工厂方法来替代公开构造器,以提供更灵活的实例创建策略。 2. **枚举代替常量类**:枚举类型不仅提供了安全性和便利性,还能避免...

    【JAVA 11】 Java SE Development Kit 11.0.16.1

    - 在某些集合类中,如`Optional`、`Map.of()`和`List.of()`,使用静态工厂方法代替传统的构造器,以提供不可变的集合实例,提高了代码的安全性。 5. **字符串串联优化**: - Java 11对字符串串联进行了优化,使用...

    EFFECT JAVA 中文

    1. **构造器与工厂方法**:书中强调了如何正确使用构造器,包括私有构造器、工厂方法和静态工厂方法。静态工厂方法的优势在于它们可以有选择性地返回类的子类型实例,而无需暴露其实现细节。 2. **设计和实现equals...

    Effective-java-3e-source-code:有效Java第三版的源代码,并进行了必要的补充以使其可运行

    再者,“尽可能使用静态工厂方法而非构造器”。静态工厂方法比构造器更加灵活,不改变类的实例化方式,且可以有更丰富的返回类型。源代码会展示如何定义和使用静态工厂方法,以及在哪些场景下它们更为适用。 “优先...

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    6. **构造器与工厂方法**:讨论了构造器与工厂方法之间的权衡,指出工厂方法可以提供更好的灵活性,如延迟初始化和返回子类实例。 7. **接口与抽象类**:解释了接口和抽象类的选择依据,以及何时使用单例接口,何时...

    二十三种设计模式【PDF版】

    《Thingking in Java》(第一版中文)是这样描述设计模式的:他在由 Gamma, Helm 和 Johnson Vlissides 简称 Gang of Four(四人 帮),缩写 GoF 编著的《Design Patterns》一书中被定义成一个“里程碑”。事实上,那本书...

    jdk-11.0.8_windows-x64_bin.rar

    4. **静态工厂方法代替构造函数( sealed classes)**:增强了类的封装性,控制了子类的扩展。 5. **文本块(Text Blocks)**:在Java 13引入,11中没有,但在后续版本中,这是一个显著提升代码可读性的特性,特别是...

    创建型设计模式(下)

    - **懒汉式**:在第一次使用时才初始化,因此类加载速度快,但获取对象时可能会因为多线程同步问题而变慢。 在实际开发中,可以根据应用的需求和性能考虑来选择合适的单例模式实现方式。 #### 原型设计模式 原型...

    设计模式第三部分.zip

    单例模式的关键在于防止其他对象创建额外的实例,通常通过私有构造函数和静态工厂方法实现。 2. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一...

    Symbian OS C++高效编程

    第1章 Symbian OS中的类命名约定 11.1 基本类型 11.2 T类 21.3 C类 31.4 R类 51.5 M类 61.6 静态类 91.7 使用者注意事项 91.8 小结 9第2章 异常退出(leave):Symbian OS的异常 102.1 异常退出...

Global site tag (gtag.js) - Google Analytics