[英]Getter for private member object in Java
說我有一個叫做Truck
的類,私有成員變量之一是Wheel
類。 Wheel
變量getWheel
getter將返回對其的引用,如下所示:
class Truck{
private Wheel wheel;
Truck(){
wheel=new Wheel();
}
Wheel getWheel(){
return this.wheel;
}
}
class Wheel{
int color;
}
現在,調用getWheel
任何人都可以隨意修改私有成員對象:
class me{
public static void main(String[] args){
Truck ye=new Truck();
Wheel v=ye.getWheel();
v.color=2;
}
}
這會破壞封裝,不是嗎?
什么是正確的補救辦法?
通常的方法是:
Wheel
的副本 ) Wheel
不可變(任何時候要更改它,都可以創建一個新的,並以新的顏色構造) Wheel
,返回一個不可變的接口Wheel
,只有公開干將,沒有變異操作 public
的吸氣劑。 然后,包裝內的類可以設置Wheel
的顏色,但是包裝外的類不能設置。 (在這種情況下,我更傾向於使用#3來實現清晰的分隔,但是如果您越過可見性邊界,也可以這樣做。) 第三種選擇是為什么通常將實例變量(字段)設為非private
的原因之一。
這里的#3更深入,只是因為它比#1和#2更復雜,而不是因為它必須更好(不是,設計選擇是在上下文中做出的)。
只讀接口,通常為public或package-private,具體取決於您將如何使用所有這些東西:
public interface Wheel {
int getColor();
}
具體的類,通常是package-private(如果是在Truck
上使用的唯一位置,則可以是Truck
的私有靜態嵌套類):
class WheelImplementation implements Wheel {
private int color;
WheelImplementation(int color) {
this.color = color;
}
public int getColor() {
return this.color;
}
void setColor(int color) {
this.color = color;
}
}
Truck
,通常與Wheel
相同的能見度:
public class Truck {
private WheelImplementation wheel;
Truck(){
this.wheel = new WheelImplementation(/*...initial color...*/);
}
Wheel getWheel() {
return this.wheel;
}
}
當然,可以通過反射來克服它,但是通常您設計的API是使用而不是濫用。 :-)
您可以為車輪顏色設置專用/打包設置器。 另外,在構造函數中初始化顏色,這將幫助您實現這一目標。
與其他答案一樣,返回Wheel的副本也是執行此操作的好方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.