gpt4 book ai didi

java - Java中私有(private)成员对象的getter

转载 作者:搜寻专家 更新时间:2023-10-31 08:31:47 25 4
gpt4 key购买 nike

假设我有一个名为 Truck 的类,其中一个私有(private)成员变量属于 Wheel 类。 Wheel 变量 getWheel 的 getter 将返回对它的引用,如下所示:

class Truck{
private Wheel wheel;

Truck(){
wheel=new Wheel();

}

Wheel getWheel(){
return this.wheel;
}
}

class Wheel{
int color;
}

现在,无论谁调用getWheel,都可以随意修改私有(private)成员对象:

class me{
public static void main(String[] args){
Truck ye=new Truck();
Wheel v=ye.getWheel();

v.color=2;
}
}

这会破坏封装,不是吗?

什么是正确的补救措施?

最佳答案

通常的做法是:

  • 制作防御性副本(例如,返回 Wheel副本)
  • 使 Wheel 不可变(任何时候你想改变它,你创建一个新的,用新的颜色构造)
  • 不返回 Wheel,返回 Wheel 上的不可变接口(interface),只公开 getter,没有变异操作
  • As Sandeep said , 使 settergetter 更受限制,例如,setter 的 package-private 和 getter 的 public。然后包内的类可以设置Wheel的颜色,但包外的类不能。 (在这种情况下,我更喜欢 #3 以实现清晰的分离,但如果您正在跨越可见性边界,这也适用。)

第三个选项是为什么将实例变量(字段)设置为非私有(private)通常被认为是不良做法的原因之一。

这是更深入的 #3,只是因为它比 #1 和 #2 更复杂,而不是因为它一定更好(它不是,设计选择是在上下文中做出的)。

一个只读接口(interface),通常是公共(public)的或包私有(private)的,具体取决于您将如何使用所有这些东西:

public interface Wheel {
int getColor();
}

具体类,通常是包私有(private)的(可以是 Truck 中的私有(private)静态嵌套类,如果这是唯一使用它的地方):

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 是为了使用,而不是为了滥用。 :-)

关于java - Java中私有(private)成员对象的getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43134683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com