访问复制构造函数中另一个对象的私有字段 - 真的有问题吗?

时间:2010-03-12 09:24:06

标签: java encapsulation

在我的Java应用程序中,我有一些像这样的复制构造函数

public MyClass(MyClass src) {
    this.field1 = src.field1;
    this.field2 = src.field2;
    this.field3 = src.field3;
...
}

现在Netbeans 6.9警告这个,我想知道这个代码有什么问题?

我的担忧:

  • 使用getter可能会引入不必要的副作用。新对象可能不再被视为原始对象的副本。
  • 如果建议使用getter,如果还要为新实例使用setter,它会不会更加一致?

编辑:实际警告是“访问另一个对象的私有字段”,Netbeans提供的唯一可用操作是添加@SuppressWarnings("AccessingNonPublicFieldOfAnotherObject")

我的代码实际上和给定的例子一样简单。

4 个答案:

答案 0 :(得分:8)

我发现代码没有问题。事实上,我与您分享您的担忧,并且宁愿不使用吸气剂。

你得到的警告究竟是什么?也许这与你没有向我们展示的东西有关?

更新:似乎Netbeans真的在抱怨这一点。我想,这是一个带有IDE的相当有争议的警告。

答案 1 :(得分:6)

它让我想起讨论 ADT 对象

ADT可以访问ADT的其他实例的内部状态。对象哲学将阻止这种情况并通过getter / setter强制执行访问以确保表示独立性

Java中的实例变量是 class-private ,而不是 object-private (在后一种情况下只允许this.privateInstVar,这是一个慎重的选择,不是obj.privateInstVar)。

这既有优点也有缺点。当涉及克隆平等时,它特别方便。另一方面,它可能被滥用和打破封装

这几乎是一场哲学辩论。但恕我直言,你所做的很好。

答案 2 :(得分:4)

我不知道为什么NetBeans会发出警告,但您实际上是在制作副本。您的副本与src共享field1,field2和field3,因此对field3(例如List)的修改将反映在原始文件中。

private List field1;

public MyClass(MyClass src) {
    this.field1 = src.field1;
    this.field2 = src.field2;
    this.field3 = src.field3;

    field1.add(new Object()); // field1 of src also modified
...
}

答案 3 :(得分:0)

也许该类可以提供浅拷贝方法,该方法知道在复制的对象中返回哪些数据。如果需要,您也可以提供深层复制。

public MyClass shallowCopy() {
  MyClass aCopy = new MyClass();
  aCopy.field1 = this.field1;
  aCopy.field2 = this.field2;
  aCopy.field3 = this.field3;
}