Java静态内部类——重点是精妙的demo

什么是内部类  


  大部分时候,类被定义成一个独立的程序单元。在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类(有些地方也叫做嵌套类),包含内部类的类也被称为外部类(有些地方也叫做宿主类)


作用??  


更好的封装性
内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,但外部类不能访问内部类的实现细节,例如内部类的成员变量
匿名内部类适合用于创建那些仅需要一次使用的类


静态or非静态??  

 
使用static来修饰一个内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象。称为静态内部类(也可称为类内部类),这样的内部类是类级别的,static关键字的作用是把类的成员变成类相关,而不是实例相关

注意: 
1.非静态内部类中不允许定义静态成员 
2.外部类的静态成员不可以直接使用非静态内部类 
3.静态内部类,不能访问外部类的实例成员,只能访问外部类的类成员

Demo  

 
今天这个Demo展示了通过内部类来实例化pojo对象

我们首先来看看一遍的pojo对象如何编写,无非就是字段+set get方法,如下所示:

public class EmpTest {
    private Integer id;
    private Integer empLevel;
    private String mapingOrderLevel;
    private String empNo;
    private Integer orderNumLimit;


    public static final class Builder {
        private Integer id;
        private Integer empLevel;
        private String mapingOrderLevel;
        private String empNo;
        private Integer orderNumLimit;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getEmpLevel() {
        return empLevel;
    }

    public void setEmpLevel(Integer empLevel) {
        this.empLevel = empLevel;
    }

    public String getMapingOrderLevel() {
        return mapingOrderLevel;
    }

    public void setMapingOrderLevel(String mapingOrderLevel) {
        this.mapingOrderLevel = mapingOrderLevel;
    }

    public String getEmpNo() {
        return empNo;
    }

    public void setEmpNo(String empNo) {
        this.empNo = empNo;
    }

    public Integer getOrderNumLimit() {
        return orderNumLimit;
    }

    public void setOrderNumLimit(Integer orderNumLimit) {
        this.orderNumLimit = orderNumLimit;
    }

}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657

添加了内部类的实体定义如下:(已经不再是严格的POJP)

public class EmpTest {
    private Integer id;
    private Integer empLevel;
    private String mapingOrderLevel;
    private String empNo;
    private Integer orderNumLimit;


    //外部类私有的构造方法
    private EmpTest(Builder builder) {
        setId(builder.id);
        setEmpLevel(builder.empLevel);
        setMapingOrderLevel(builder.mapingOrderLevel);
        setEmpNo(builder.empNo);
        setOrderNumLimit(builder.orderNumLimit);
    }

    //对外提供初始化EmpTest类的唯一接口,通过这个方法,获得内部类的实例
    public static Builder newBuilder() {
        return new Builder();
    }

    //静态内部类:Builder
    public static final class Builder {
        private Integer id;
        private Integer empLevel;
        private String mapingOrderLevel;
        private String empNo;
        private Integer orderNumLimit;

        public Builder() {
        }

        public Builder id(Integer val) {
            id = val;
            return this;
        }

        public Builder empLevel(Integer val) {
            empLevel = val;
            return this;
        }

        public Builder mapingOrderLevel(String val) {
            mapingOrderLevel = val;
            return this;
        }

        public Builder empNo(String val) {
            empNo = val;
            return this;
        }

        public Builder orderNumLimit(Integer val) {
            orderNumLimit = val;
            return this;
        }
        //通过内部类的build方法,实例化外部类,并给其实例各个字段赋值
        public EmpTest build() {
            return new EmpTest(this);
        }

    }

    public Integer getId() {
        return id;
    }

    //...下边的get set 方法省略,和第一段一样

}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

//初始化20个员工实例:
for(int i=0;i<20;i++){
            empList.add(EmpTest.newBuilder().empLevel(getRandom(5)).empNo("Emp_"+i).id(i).mapingOrderLevel(getRandomChar()).orderNumLimit(getRandom(20)).build());
        }1234

讲解: 
1.EmpTest中 定义了一个Builder的静态内部类,还定义了一个newBuilder的公共静态方法,上边讲过加了static关键字,那么就是类相关,所以我不需要实例化外部类,直接使用外部类就可以调用newBuilder的方法

2.Builder的实例在调用各个内部类中的方法,给Builder的字段赋值

3.最后调用build()方法,实例化EmpTest,它的构造方法需要builder的对象,所以将builder的对象传入,通过builder的字段值给EmpTest的对象赋值

经过了静态内部类与静态方法相结合,给实体赋值的时候才能一句话(如下)就能完成任务,而不再需要通过传统的set方法

EmpTest类.newBuilder.id(“xxx”).empLevel(xxx)…..build();

小结  

 
这是小张哥回来给我分享的代码,其实代码就是照猫画虎的过程,如果永远自己想怎么写就怎么写,那么永远也不会写出富有艺术感的代码,这段代码设计很精妙,拿过来和大家分享分享
————————————————
版权声明:本文为CSDN博主「Celine丹」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cd18333612683/article/details/79129503

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值