[英]How to access a private field in a private field in another class using Java
[英]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.