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

Dan*_*ski 13 java encapsulation

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

public MyClass(MyClass src) {
    this.field1 = src.field1;
    this.field2 = src.field2;
    this.field3 = src.field3;
...
}
Run Code Online (Sandbox Code Playgroud)

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

我的担忧:

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

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

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

Thi*_*ilo 8

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

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

更新:似乎Netbeans真的在抱怨这一点.我想,对于配备IDE,这是一个颇具争议的警告.

  • 绝对.在我看来,private的概念是对类实现*的私有.复制构造函数是类实现的一部分,可以使用私有数据执行它喜欢的操作. (4认同)

ewe*_*nli 6

它让我想起ADTObject的讨论.

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

这是一个经过深思熟虑的选择,Java中的实例变量是类私有的,而不是对象私有的(在后一种情况下只this.privateInstVar允许,不是obj.privateInstVar).

这既有优点也有缺点.在克隆平等方面,它特别方便.另一方面,它可能被滥用并打破封装.

这几乎是一场哲学辩论.但恕我直言,你在做什么都没关系.