《Effective Java》中文第三版,是一本关于Java基础的书,这本书不止一次有人推荐我看。其中包括我很喜欢的博客园博主五月的仓颉,他曾在自己的博文《给Java程序猿们推荐一些值得一看的好书》中也推荐过。加深自己的记忆,同时向优秀的人看齐,决定在看完每一章之后,都写一篇随笔。如果有写的不对的地方、表述的不清楚的地方、或者其他建议,希望您能够留言指正,谢谢。
《Effective Java》中文第三版在线阅读链接.
一个在创建对象时自动被调用的方法。
当类中没有定义构造方法时,系统会默认添加一个无参的构造方法,当在类中定义构造方法的时候,默认的构造方法会消失。
public class Cat {
//名字
private String name;
//颜色
private String color;
//年龄
private Integer age;
//构造方法的名称和类同名
public Cat(){
}
//带一个参数的构造方法
public Cat(String name){
this.name = name;
//普通方法不能以任何形式调用构造方法,构造方法中可以调用普通方法
commonMethod();
}
//有两个参数的构造方法
public Cat(String name, String color){
this.name = name;
this.color = color;
}
public void commonMethod(){
}
}
在类中提供一个公共的静态方法,通过这个静态方法,对外提供自身实例。
public class Cat {
//名字
private String name;
//颜色
private String color;
//年龄
private Integer age;
//创建只有名字的猫,带有一个构造参数
public static Cat createCatWithName(String name){
Cat cat = new Cat();
cat.name = name;
return cat;
}
//创建只有颜色的猫,带有一个构造参数
public static Cat createCatWithColor(String color){
Cat cat = new Cat();
cat.color = color;
return cat;
}
//创建有名字、颜色、年龄的猫
public static Cat createCatWithAllParam(String name, String color, Integer age){
Cat cat = new Cat();
cat.age = age;
cat.name = name;
cat.color = color;
return cat;
}
}
请参考上方的两个实例。
public class Test02 {
private String s1;
private String s2;
private String s3;
private Integer i1;
public Test02(){
}
public Test02(String s1){
this.s1 = s1;
}
public Test02(String s1, String s2){
this.s1 = s1;
this.s2 = s2;
}
public Test02(String s1, Integer i1){
this.s1 = s1;
this.i1 = i1;
}
public Test02(String s1, String s2, String s3){
this.s1 = s1;
this.s2 = s2;
this.s3 = s3;
}
public static Test02 createTest02InitAParam(String s1){
Test02 result = new Test02();
result.s1 = s1;
return result;
}
public static Test02 createTest02InitTwoParam(String s1, String s2){
Test02 result = new Test02();
result.s1 = s1;
result.s2 = s2;
return result;
}
public static Test02 createTest02InitThreeParam(String s1, String s2, String s3){
Test02 result = new Test02();
result.s1 = s1;
result.s2 = s2;
result.s3 = s3;
return result;
}
public static void main(String[] args) {
//构造方法创建对象
//前面我们说过,构造方法的名称和类同名,这导致构造函数的名称不够灵活,不能准确的描述返回值。
//如果参数类型、数目比较相似的话,更加不容易找到合适的构造函数。例如test02与test04。
Test02 test0 = new Test02();
Test02 test01 = new Test02("A");
Test02 test02 = new Test02("A","B");
Test02 test03 = new Test02("A","B","C");
Test02 test04 = new Test02("A", 1);
//静态工厂方法创建对象
//这让程序员更好的记得调用哪个方法创建适合自己需要的实例。注意仔细选择名称来突出它们的差异,这里我只是随便取的名字。
Test02 aParam = Test02.createTest02InitAParam("A");
Test02 twoParam = Test02.createTest02InitTwoParam("A", "B");
Test02 threeParam = Test02.createTest02InitThreeParam("A", "B", "C");
}
}
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
Class Person {
public static Person getInstance(){
return new Person();
// return new Son01() / Son02()
}
}
Class Son01 extends Person{
}
Class Son02 extends Person{
}
public class Test03 {
public static final int TYPE_A = 1;
public static final int TYPE_B = 2;
public static final int TYPE_C = 3;
int type;
private Test03(int type) {
this.type = type;
}
public static Test03 newA() {
return new Test03(TYPE_A);
}
public static Test03 newB() {
return new Test03(TYPE_B);
}
public static Test03 newC() {
return new Test03(TYPE_C);
}
public static void main(String[] args) {
Test03 test03 = newA();
}
}
public class Person {
private String name;
private Integer age;
private Person(String name, Integer age){
this.name = name;
this.age = age;
}
public static Person getSon01(String name, Integer age){
return new Person(name, age);
}
public static Person getSon02(String name, Integer age){
return new Person(name, age);
}
//此时Student无法创建,因为Person没有公共的构造方法
public class Son extends Person{
}
}
静态工厂方法,语法层面:
能够有自己的名字
用子类使代码更加紧凑。
性能的层面:
避免创建大量等价的实例对象。
最重要的是,当我们作为类的提供者,能够更好的控制调用者的具体行为,减少调用方出错的行为。我认为这也是对自己代码负责的体现。