簡體   English   中英

Java中私有成員對象的Getter

[英]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 ,只有公開干將,沒有變異操作
  • 由於桑迪普說 ,使二傳手吸氣更多限制,比方說,包裝和私營部門的setter和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM