1. 程式人生 > >Java靜態內部類——重點是精妙的demo

Java靜態內部類——重點是精妙的demo

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/cd18333612683/article/details/79129503
什麼是內部類
大部分時候,類被定義成一個獨立的程式單元。在某些情況下,也會把一個類放在另一個類的內部定義,這個定義在其他類內部的類就被稱為內部類(有些地方也叫做巢狀類),包含內部類的類也被稱為外部類(有些地方也叫做宿主類)

作用??
更好的封裝性
內部類成員可以直接訪問外部類的私有資料,因為內部類被當成其外部類成員,但外部類不能訪問內部類的實現細節,例如內部類的成員變數
匿名內部類適合用於建立那些僅需要一次使用的類
靜態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 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();
---------------------
作者:Celine丹
來源:CSDN
原文:https://blog.csdn.net/cd18333612683/article/details/79129503
版權宣告:本文為博主原創文章,轉載請附上博文連結!