Java内部类只应该服务于它的外部类,否则就不应该写成内部类
非静态内部类
可以在一定程度上看作是“实例成员变量”,它拥有对外部类隐式的引用,在内部类中,可以有如下权限:
- 访问内部类的实例方法
- 通过this关键字得到外部类对象的引用
非静态Builder实现
public class NonstaticBuilderDemo {
private String s1;
private String s2;
private String s3;
private String s4;
public class NonStaticBuilder{
private String ins1;
private String ins2;
private String ins3;
private String ins4;
public NonStaticBuilder s1(String s1){
this.ins1 = s1;
return this;
}
public NonStaticBuilder s2(String s2){
this.ins2 = s2;
return this;
}
public NonStaticBuilder s3(String s3){
this.ins3 = s3;
return this;
}
public NonStaticBuilder s4(String s4){
this.ins4 = s4;
//invoke instance method outside
getS1();
//obtain a reference to the enclosing instance using the qualified this construct
NonstaticBuilderDemo this = NonstaticBuilderDemo.this;
return this;
}
public NonstaticBuilderDemo build(){
NonstaticBuilderDemo nonstaticBuilderDemo = new NonstaticBuilderDemo();
nonstaticBuilderDemo.s1 = ins1;
nonstaticBuilderDemo.s2 = ins2;
nonstaticBuilderDemo.s3 = ins3;
nonstaticBuilderDemo.s4 = ins4;
return nonstaticBuilderDemo;
}
}
public String getS1() {
return s1;
}
}
静态内部类
可以在一定程度上看作是“静态成员变量”,在该内部类中,可以有如下权限:
- 访问外部类的静态成员变量
静态builder实现
public class StaticBuilderDemo {
private final String s11;
private final String s2;
private final String s3;
private final String s4;
public static class Builder{
private String ins1;
private String ins2;
private String ins3;
private String ins4;
public Builder( ) {
}
public Builder s1(String s1){
this.ins1 = s1;
return this;
}
public Builder s2(String s2){
this.ins2 = s2;
return this;
}
public Builder s3(String s3){
this.ins2 = s3;
return this;
}
public Builder s4(String s4){
this.ins2 = s4;
return this;
}
public StaticBuilderDemo build(){
//关键字this,this的妙用
//赋值要想着在内部完成,outer.s1 = this.s1(不能这样干,静态内部类不能获取外部的非静态变量)
return new StaticBuilderDemo(this);
}
}
private StaticBuilderDemo(Builder builder){
this.s11 = builder.ins2;
this.s2 = builder.ins2;
this.s3 = builder.ins3;
this.s4 = builder.ins4;
}
}