使用私有属性复制构造函数

时间:2010-03-11 18:23:26

标签: constructor attributes copy private

我的第一个问题是温柔的。

我想要以下代码的参数:

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方法会导致不必要的开销。

我站在十字路口。你能解释一下吗?

2 个答案:

答案 0 :(得分:1)

Access是基于类的,而不是基于对象的。

使成员私有的基本原理是,类不应该知道在定义良好的API之外的实现细节,以便使系统的其余部分容忍实现的改变。但是,复制构造函数不是“系统的第一个” - 它是您自己的类。

答案 1 :(得分:1)

第一个例子不是复制实例的私有属性,因为它们是同一类的bot实例。

但是,如果你添加访问方法/属性,任何体面的编译器都应该将它们优化为简单的“内联”,在这种情况下,第二种方法是更清晰的代码(所有访问都通过你的访问函数),但这两种方法都应该结束我们同样有效(可能相同)的成员副本。

如果您确实希望复制构造函数有效,那么较低级别的二进制副本将比成员副本更快。但显然“更脏”。

一般情况下,我更喜欢通过属性/访问器访问所有成员字段,因为它更好地封装了它们,允许您更改字段的底层实现/存储,而不必更改任何访问它的代码,除了属性/ accessor本身。