Java静态嵌套类——核心是精妙的demo

原创
小哥 3年前 (2022-11-14) 阅读数 7 #大杂烩

什么是内部类

大多数时候,类被定义为一个单独的程序单元。在某些情况下,一个类也放在另一个类的内部定义中。在其他类中定义的类称为内部类(在某些地方也称为嵌套类),而包含内部类的类也称为外部类(在一些地方也称为宿主类)

作用??

  • 更好的封装
  • 内部类成员可以直接访问外部类的私有数据,因为内部类被视为其外部类的成员,但外部类无法访问内部类的实现细节,例如内部类的成员变量。
  • 匿名内部类适合创建只需要使用一次的类。

静态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;
    }

}

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

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

    //外部类private的构造方法。
    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 方法省略,与第一段相同

}

//初始化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());
        }

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

2.Builder的实例调用每个内部类中的方法,给出Builder字段分配

3.最后调用build()方法,实例化EmpTest,其施工方法要求builder对象,也会。builder对象通过传入。builder的字段值EmpTest对象分配

在组合静态内部类和静态方法之后,可以为实体分配一个句子。(如下)无需通过传统的set方法

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

小结

这是小张大哥回来和我分享的代码。实际上,代码是根据猫画老虎的过程。如果你总是想怎么写就怎么写,你永远不会写艺术代码。这个代码设计非常精致。请与您分享。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除