【问题标题】:Copy constructor using private attributes使用私有属性复制构造函数
【发布时间】:2011-01-26 12:29:39
【问题描述】:

我在这里的第一个问题,所以要温柔。

我想要以下代码的参数:

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

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

【问题讨论】:

  • 第一个问题很好。

标签: constructor attributes copy private


【解决方案1】:

第一个示例不是复制实例的私有属性,因为它们是同一类的机器人实例。

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

如果您真的希望复制构造函数高效,那么较低级别的二进制复制将比成员复制更快。但明显“更脏”。

一般来说,我更喜欢通过属性/访问器访问所有成员字段,因为这样可以更好地封装它们,允许您更改字段的底层实现/存储,而无需更改任何访问它的代码,除了属性/访问器本身。

【讨论】:

    【解决方案2】:

    访问是基于类的,而不是基于对象的。

    将成员设为私有的理由是,其他类不应该知道定义良好的 API 之外的实现细节,从而使系统的其余部分能够容忍实现的变化。但是,复制构造函数不是“系统的第一个”——它是你自己的类。

    【讨论】:

    • 嘿 DVK,“系统的第一个”是什么意思?我确实理解你的观点,我从一位编程老师那里得到了同样的答案。
    • 系统的其余部分 - 你的类之外的任何代码/类。
    猜你喜欢
    • 2016-02-23
    • 2012-10-10
    • 2020-06-12
    • 2016-10-13
    • 2011-09-12
    • 2016-07-17
    • 2015-05-11
    • 2013-01-20
    • 2016-02-27
    相关资源
    最近更新 更多