我的第一个问题是温柔的。
我想要以下代码的参数:
public class Example {
private String name;
private int age;
...
// copy constructor here
public Example(Example e) {
this.name = e.name; // accessing a private attribute of an instance
this.age = e.age;
}
...
}
我相信这会破坏传递给复制构造函数的实例的模块性。 这是我认为是正确的:
public class Example {
private String name;
private int age;
...
// copy constructor here
public Example(Example e) {
this.setName(e.getName());
this.setAge(e.getAge());
}
...
}
朋友已经暴露了一个有效的观点,他说在复制结构中我们应该尽可能快地创建对象。并且添加getter / setter方法会导致不必要的开销。
我站在十字路口。你能解释一下吗?
答案 0 :(得分:1)
Access是基于类的,而不是基于对象的。
使成员私有的基本原理是,类不应该知道在定义良好的API之外的实现细节,以便使系统的其余部分容忍实现的改变。但是,复制构造函数不是“系统的第一个” - 它是您自己的类。
答案 1 :(得分:1)
第一个例子不是复制实例的私有属性,因为它们是同一类的bot实例。
但是,如果你添加访问方法/属性,任何体面的编译器都应该将它们优化为简单的“内联”,在这种情况下,第二种方法是更清晰的代码(所有访问都通过你的访问函数),但这两种方法都应该结束我们同样有效(可能相同)的成员副本。
如果您确实希望复制构造函数有效,那么较低级别的二进制副本将比成员副本更快。但显然“更脏”。
一般情况下,我更喜欢通过属性/访问器访问所有成员字段,因为它更好地封装了它们,允许您更改字段的底层实现/存储,而不必更改任何访问它的代码,除了属性/ accessor本身。