簡體   English   中英

如何使用Java中的getter保護類中的私有字段

[英]How to protect private field in class with getter in java

我有以下代碼。

public class GetterTest {

    public static void main(String[] args) {
        Car car = new Car();

        StringBuilder wheel = car.getWheel();
        wheel.append("asd");

        System.out.println(car.getWheel());
    }
}

class Car {

    private StringBuilder wheel;

    public Car() {
        wheel = new StringBuilder("a");
    }

    public StringBuilder getWheel() {
        return wheel;
    }

    public void setWheel(StringBuilder wheel) {
        this.wheel = wheel;
    }

}

這里的問題是,即使我有一個吸氣劑,它也不能保護變量,並且在使用它后會對其進行更改。 如何更好地保護變量?

您不應返回StringBuilder ,而應返回值。 這將創建一個新的String ,該String不再連接到您的支持StringBuilder

public String getWheel() {
    return wheel.toString();
}

但是,如果您確實想返回StringBuilder ,則可以使用當前數據創建一個新的StringBuilder ,實際上是斷開兩個實例的連接:

public StringBuilder getWheel() {
    return new StringBuilder(wheel.toString());
}

StringBuilder變量不是獲取方法的理想選擇。 有一個getter返回那個StringBuilder的當前String值會更有意義,因為一個String是不可變的:

public String getWheel() {
    return wheel.toString();
}

設置器也應該更改,因為當前的impl允許設置器的調用者對傳遞給設置器的StringBuilder進行更改,從而在調用設置器后對成員進行更改。

public void setWheel (String wheel)
{
    this.wheel = new StringBuilder (wheel);
}

在要保護getter的字段中,您可以克隆該字段,而不用返回當前字段。

public void doSomething() {
    Car car = new Car();

    Wheel wheel = car.getWheel();
    wheel.getaVariable().append("asd");

    System.out.println(car.getWheel());
}

public class Car {
    private Wheel wheel;

    public Car() {
        wheel = new Wheel();
    }

    public Wheel getWheel() {
        Wheel output = null;
        try {
            output = wheel.clone();
        } catch (CloneNotSupportedException e) {
            // Manage exception
        }
        return output;
    }

    public void setWheel(Wheel wheel) {
        this.wheel = wheel;
    }
}

public class Wheel implements Cloneable {
    private StringBuilder aVariable;

    public Wheel() {
        aVariable = new StringBuilder("a");
    }

    public StringBuilder getaVariable() {
        return aVariable;
    }

    public void setaVariable(StringBuilder aVariable) {
        this.aVariable = aVariable;
    }

    @Override
    protected Wheel clone() throws CloneNotSupportedException {
        Wheel clone = (Wheel) super.clone();
        clone.setaVariable(new StringBuilder(aVariable));
        return clone;
    }

    @Override
    public String toString() {
        return aVariable.toString();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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