在我的Java应用程序中,我有一些像这样的复制构造函数
public MyClass(MyClass src) {
this.field1 = src.field1;
this.field2 = src.field2;
this.field3 = src.field3;
...
}
现在Netbeans 6.9警告这个,我想知道这个代码有什么问题?
我的担忧:
编辑:实际警告是“访问另一个对象的私有字段”,Netbeans提供的唯一可用操作是添加@SuppressWarnings("AccessingNonPublicFieldOfAnotherObject")
我的代码实际上和给定的例子一样简单。
答案 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;
}