`
cbq881215
  • 浏览: 3005 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

java高效编程之静态工厂方法代替构造函数

    博客分类:
  • java
阅读更多

 

一般为了获得一个类的实例,我们最常用的方法就是提供一个或多个公有的构造函数,这个大家都理解,但是实际上还有另一种 创建对象的方法:静态工厂方法
比如java中为Boolean 类提供了如下静态工厂方法代替构造函数:
public static Boolean valueOf(boolean b){
     return (b?Boolean.True:Boolean.FALSE);
}
使用Boolean.valueOf()方法就可以直接使用了
那么, new Boolean(aval).booleanValue() 和Boolean.valueOf(aval).booleanValue() 有什么区别?
它们之间差别在于new Boolean开辟了新的内存空间。从程序开发,内存角度来讲,推荐直接用静态方法(第二种),最起码省内存呢。

用静态工厂方法代替公有的构造函数,是有好处,但也有他的不足之处.

1、静态工厂方法的一个好处是,和构造函数不同,静态工厂方法具有名字。因为可以向外部调用时,由静态方法名可以知道方法的用途。如果只用构造函数,你可能永远也记不住该用哪个构造函数,结果常常会调用错误的构造函数上,不可知道构造函数的作用。,除非去看类的文档说明。
2、静态工厂方法的第二个好处是,与构造函数不同,它们每次被调用的时个,不要求非创建一个新的对象。比如上面的Boolean.valueOf()方法。如果一个程序频繁地创建对象,并且创建对象的代价很昂贵,用静态工厂方法可以极大的提高性能。单例模式就用了静态工厂方法。
3、静态工厂方法的每三个好处是,与构造函数不同,它们可以返回一个原返回类型的子类的对象

4、静态工厂方法的主要缺点是。类如果没有公有的或都受保护的构造函数,就不能被了类化。如果类中为了不让被实例化,只提供私有构造函数,那么此类不可继承。不过这既是缺点也是优点吧!呵呵
4、静态工厂方法的第二个缺点是,它们与其他的静态方法没有区别。类中有用于生成类的实例的静态工厂方法,也要其他功能的普通静态方法,因为在使用时可能会区分不了那个是静态工厂方法。这就要注意命名规范,使用调用者看名知意。将缺点减少到最小影响。 比如我经常用名到getInstance方法表示返回一个唯一的实例。


静态工厂方法和公有构造函数都有各自的用途。用哪个要看实际情况,如果没有其他因素影响你的选择,那么你最好还是老老实实的使用构造函数,毕竟它是java的规范。



分享到:
评论

相关推荐

    java用静态工厂代替构造函数使用方法和优缺点

    本篇文章将深入探讨静态工厂方法代替构造函数的使用方法以及它们的优缺点。 首先,我们来看一下静态工厂方法的基本形式。一个典型的静态工厂方法可能如下所示: ```java public static Boolean valueOf(boolean b)...

    Java高效编程指南.doc

    - **静态工厂方法**:使用静态工厂方法代替构造函数,因为它们可以拥有特定的名字,避免不必要的对象创建,且可以返回任何子类的对象,增加灵活性。 - **Singleton模式**:用于确保一个类只有一个实例,并提供一个...

    java私有构造函数

    在Java编程语言中,构造函数(Constructor)是用于初始化新创建的对象的关键组成部分。默认情况下,构造函数的访问级别设置为`public`,以便其他类能够通过这个构造函数实例化对象。然而,在某些特定场景下,将构造...

    Java学习总结(2023/03/19)

    17. 使用私有静态工厂方法代替构造函数。 18. 优先考虑使用私有构造函数和公有工厂方法。 19. 使用私有构造函数实现不可实例化的工具类。 20. 使用枚举来实现Singleton模式。 21. 避免创建不必要的对象。 22. 使用...

    google-java-styleguide

    3. 单例模式:推荐使用静态工厂方法代替公有构造函数实现单例。 四、异常处理 1. 异常类型:尽量避免使用`Exception`作为抛出的异常类型,应具体到某种异常,如`IOException`。 2. try-catch-finally:`finally`块...

    effective-java 配套代码

    3. **构造函数与工厂方法(Constructors and Factory Methods)**: 书中提倡使用工厂方法代替公共构造函数,以实现更好的封装和灵活性。这里可能包含不同类型的工厂模式实现。 4. **可变与不可变对象(Mutable vs ...

    Effecctive java 中文版

    9. **项9:使用静态工厂方法代替构造器** 静态工厂方法有命名自由、不需暴露构造器、可以返回原类型或子类型的实例等优势。 10. **项10:考虑提供一个无参构造器用于序列化** 序列化时,如果类没有无参构造器,...

    Effective-Java读书笔记

    3. **优先考虑静态工厂方法而非构造器**:静态工厂方法比公有构造器更灵活,它们不需要在每次实例化时都创建一个新的类实例,还可以返回已缓存的实例或限制对象的创建。 4. **使用不可变对象**:不可变对象一旦创建...

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

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

    jdk-11.0.8_windows-x64_bin.rar

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

    JAVA JDK11版本

    4. **静态工厂方法代替构造器**:在JDK11中,一些类如`Optional`和`Stream`现在提供静态工厂方法,而不是传统的构造器,这使得代码更加简洁,也符合函数式编程的风格。 5. **强类型HTTP响应体**:HTTP客户端API引入...

    最新版linux jdk-11.0.16.1_linux-x64_bin.tar.gz

    4. **静态工厂方法代替构造函数**:对于无状态的类,鼓励使用`Objects.requireNonNull()`等静态工厂方法。 5. **改进的字符串处理**:如`isBlank()`, `strip()`, `stripIndent()`, 和 `stripTrailing()`方法。 6. **...

    Java1.8 API离线文档

    9. **新集合工厂方法**:Java 1.8的集合框架添加了一些新的工厂方法,如`Map.of()`, `Set.of()`, `List.of()`,这些方法创建不可变集合,简化了初始化代码。 10. **类型注解**:Java 1.8引入了类型注解,允许在类型...

    Java编码规范,技巧与建议

    7. **集合工厂方法**:使用`Collections.emptyList()`、`Arrays.asList()`等工厂方法创建集合,避免空构造和不必要的修改操作。 8. **异常链**:在捕获异常后抛出新的异常时,使用`throw new MyException(e)`保持...

    Beginning Java 8 Fundamentals源代码

    10. **集合工厂方法**:Java 8在集合接口上添加了工厂方法,如`List.of()`、`Set.of()`等,方便创建不可变集合,避免了构造过程中可能出现的NPE(NullPointerException)。 以上就是Java 8的一些核心特性,结合...

    effectiveJava

    10. **用私有静态工厂方法代替构造函数** 这样可以避免子类化,并且可以控制对象的创建,比如进行资源管理或缓存实例。 11. **优先考虑不可变对象** 不可变对象更安全,线程安全,易于理解,且可以缓存。它们在多...

    Java代码编写的30条建议

    16. **多用构造函数初始化对象**:避免在类的其他方法中修改实例变量。 17. **避免使用final修饰方法参数**:除非需要禁止修改,否则通常不需要。 18. **利用Java 8的流(Stream)**:进行集合操作时,使用流可以写...

    Google Java Style-en.rar

    7. **类型设计**:优先使用不可变对象,避免公开构造函数,而是提供工厂方法。使用枚举代替常量类,利用Java 8的Optional类来处理可能的null值。 8. **并发编程**:遵循线程安全的最佳实践,使用并发工具类,如`...

    java基础面试题

    Servlet是Java Web开发中处理客户端请求的核心技术之一,它提供了一种更高效、更可扩展的替代方案来代替传统的CGI(Common Gateway Interface)。Servlet在被初始化后会驻留在内存中,这使得它们能够更快地响应后续...

Global site tag (gtag.js) - Google Analytics