#########################分割线 start#########################

"我是很希望10年前就拥有这本书。可能有人认为我不需要任何Java方面的书籍,但是我需要这本书。"----Java之父James Gosling

这句话是写在《Effective Java》中文版第二版的封面上。

全文一共分了78个条目,每个条目讨论一条规则。这些规则反映了最有经验的优秀程序员在实践中常用的一些有益做法。

#########################分割线 end#########################

【第1条:考虑用静态工厂方法代替构造器】

1、静态工厂方法与构造器不同的第一个大优势在于,它们有名称。

如何理解上面的话呢?下面用代码来说明。

构造器:

public class User {
	private String username;
	private int age;

	public User(String username, int age) {
		super();
		this.username = username;
		this.age = age;
	}

	public User(int age, String username) {
		super();
		this.username = username;
		this.age = age;
	}

	public static User NewInstance(int age, String username){
		return new User(age, username);
	}
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

如上代码中有两个构造器,但只是换了一下参数的先后顺序,如果里面包含部分逻辑,那么对于调用者来说,什么时候用什么构造器来实例化是很苦恼的事情。

而静态工厂方法就不一样,它有名称,可以其区别不同的方法的含义和作用。

2、不必在每次调用它们的时候都创建一个新对象。

最典型的就是【单例模式】,如下是代码片段:

public static User GetInstance() {
		if (user == null) {
			user = new User();
		}
		return user;
	}

3、它们可以返回原返回类型的任何子类型的对象。

这句话初次一看不好理解,其实看了effective java书中的实例之后就理解,其实就是相对于构造器来说,静态工厂方法返回的类型更加丰富。

4、在创建参数化类型实例的时候,他们使代码变得更加简洁。

例如:

User user1 = new User(1,"1");
User user2 = User.NewInstance(1,"1");

虽然静态工厂方法有居多好处,但是并非没有缺点。

缺点:


1、类如果不含共有的或者受保护的构造器,就不能被子类化。

2、他们与其他的静态方法实际上没有任何区别。

总的来说,静态工厂方法和共有构造器各有好处,只是在不同的地方使用而已。