获取类的实例的方法有很多种,在这很多种方法中,它们各有优缺,各有特点。这里,只介绍2中方法

1.使用构造方法

public class Person
{
private String sex;
/**
* <构造函数>
*/
public Person(String sex)
{
this.sex = sex;
System.out.println("this is constructor method");
} }

调用如下:

 public static void main(String[] args)
{
Person male = new Person("男");
Person female = new Person("女");
}

这里可以看到,使用构造获取类的实例,每次都要new(创建新对象),每个实例对象都不相同,不能重复使用,降低了效率。并且构造方法名称与类名必须一致,如果构造方法太多(参数不同),容易引起混淆。

2.静态工厂方法

 /**
* <构造函数>
*/
public Person(String sex)
{
this.sex = sex;
System.out.println("this is constructor method");
} private final static Person male = new Person("男");
private static final Person female = new Person("女");
/**
* <静态工厂方法>
* <功能详细描述>
* @return
* @see [类、类#方法、类#成员]
*/
public static Person getMale(){
return male;
}
public static Person getFemale(){
return female;
}

调用:

 public static void main(String[] args)
{
Person male = Person.getMale();
Person female = Person.getFemale();
}

上面可以看到:

静态工厂方法的方法名可以是任意的,这一特性的优点是可以提高程序代码的可读性

静态工厂方法每次被调用的时候,是否会创建一个新的对象完全取决于方法的实现(上面的实现是不会创建新对象)

new语句只能创建当前类的实例,而静态工厂方法可以返回当前类的子类的实例,这一特性可以在创建松耦合的系统接口时发挥作用

但是,同样它有缺点:

静态工厂方法依赖于构造方法,如果构造为private或者default,就无法使用该方法;

静态工厂所用的都是静态方法,所以有其局限性。但是java有一种很好的机制去解决一些局限性,这种机制就是反射(后续);

读Effective Java笔记之one:static Factory methods instead of Constructors (静态工厂方与构造器)的更多相关文章

  1. Effective Java - Item 1: Consider static factory methods instead of constructors

    考虑使用静态工厂方法来替代构造方法, 这样的做的好处有四点. 1. 更好的表意 有的构造方法实际上有特殊的含义, 使用静态工厂方法能更好的表达出他的意思. 例如 BigInteger(int, int ...

  2. Effective Java P2 Item1 Consider static factory methods instead of constructors

    获得一个类的实例的传统方法是公共的构造方法,还可以提供一个公共的静态工厂方法(一个返回值为该类实例的简单静态方法), 例如Boolean(boolean 的封装类) public static Boo ...

  3. Effective Java 01 Consider static factory methods instead of constructors

    Advantage Unlike constructors, they have names. (BigInteger.probablePrime vs BigInteger(int, int, Ra ...

  4. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  5. Effective Java第三版(一) ——用静态工厂代替构造器

    此文做为<Effective Java>系列的第一篇,所以有必要大概说下此书的特点,当然很多人可能都看过,毕竟是有着Java四大名著之一的大名在外,不过总会有萌新不了解,例如我!<E ...

  6. Effective java笔记(二),所有对象的通用方法

    Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...

  7. Effective java笔记(一),创建与销毁对象

    1.考虑用静态工厂方法代替构造器 类的一个实例,通常使用类的公有的构造方法获取.也可以为类提供一个公有的静态工厂方法(不是设计模式中的工厂模式)来返回类的一个实例.例如: //将boolean类型转换 ...

  8. effective java笔记之单例模式与序列化

    单例模式:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 单例模式实现方式有多种,例如懒汉模式(等用到时候再实例化),饿汉模式(类加载时就实例化)等,这里用饿汉模式方法 ...

  9. effective java笔记之java服务提供者框架

    博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自 ...

随机推荐

  1. Aspose.Words操作word生成PDF文档

    Aspose.Words操作word生成PDF文档 using Aspose.Words; using System; using System.Collections.Generic; using ...

  2. Table Properties [AX 2012]

    Table Properties [AX 2012] 1 out of 2 rated this helpful - Rate this topic Updated: July 20, 2012 Ap ...

  3. 用Meta标签控制360浏览器默认极速模式打开自己的网站和正则表达式

    在head标签中添加一行代码: <html><head><meta name="renderer" content="webkit|ie-c ...

  4. MySQL数据很大的时候

    众所周知,mysql在数据量很大的时候查询的效率是很低的,因为假如你需要 OFFSET 100000 LIMIT 5 这样的数据,数据库就需要跳过前100000条数据,才能返回给你你需要的5条数据.由 ...

  5. IOS中用UIStoryBoard类初始化/跳转控制器

    1.空工程中通过创建storyboard文件加载页面   //获取Main.storyboardUIStoryboard *mainStory = [UIStoryboard storyboardWi ...

  6. aspnet excel导入导出SQLserver

    http://my.csdn.net/libin690145955/code/detail/452 http://blog.csdn.net/ltoper/article/details/532980 ...

  7. sp_sys_ERPTrigger_base

    USE [GalaxyPointDB24]GO/****** Object:  StoredProcedure [dbo].[sp_zy_Process_scrap]    Script Date: ...

  8. Android开发:ScrollView嵌套GridView的解决办法

    Android开发:ScrollView嵌套GridView的解决办法   前些日子在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便 ...

  9. SHA1加密C#

    //SHA1 static public string SHA1_Hash(string str_sha1_in) { SHA1 sha1 = new SHA1CryptoServiceProvide ...

  10. github pages搭建个人网站如何添加导航

    折腾过github pages的同学都清楚使用jekyll搭建个人网站的目录结构,而导航最终的代码是在使用的主题目录中的default.html文件中的. 我的结构如下: . ├── .html ├─ ...