【问题标题】:Initialize an object of another class in constructor在构造函数中初始化另一个类的对象
【发布时间】:2016-01-08 19:07:01
【问题描述】:

例如,我有以下实现 Icon 接口的类。在构造函数中,它通过创建参数中提供的 Color 对象的深层副本来初始化 Color 对象。

   public class CircleIcon implements Icon {
        private Color iconColor;
        private int radius;

        public CircleIcon(Color iconColor, int radius) {
            this.iconColor = new Color(iconColor.getRGB());
            this.radius = radius;
        }
    }

我的问题是:这是初始化另一个类的对象的正确方法吗?我经常在其他人的代码中看到这样的事情。在这里,this.iconColor 获取参数中提供的 Color 对象的引用,而不是其副本。

 public CircleIcon(Color iconColor, int radius) {
        this.iconColor = iconColor;
        this.radius = radius;
 }

我想知道首选哪种方式。

【问题讨论】:

    标签: java oop object constructor


    【解决方案1】:

    让我们先看看它们之间的区别。 当你这样做时,

    this.iconColor = new Color(iconColor.getRGB());
    

    正如你所说,你正在制作副本。
    当你这样做时,

    this.iconColor = iconColor;
    

    你指的是同一个对象。


    哪一个是正确的?两者都是正确的。
    哪一个更好 ?两者都不。这取决于您的要求。

    我应该什么时候使用一个而不是另一个?

    使用副本时,

    • iconColor 实例状态的更改将使您自己的 CircleIcon 实例无效。

    在以下情况下使用相同的实例,

    • iconColor 实例是不可变的。
    • iconColor 实例状态的更改不会对CircleIcon 实例的状态产生任何影响。

    【讨论】:

    • 如何在构造函数中创建对象(不是作为参数),以便稍后由方法使用。那是对的吗 ?我们是否需要直接在将要使用它的方法中创建该对象?谢谢!
    【解决方案2】:

    在设计方面:

    答案取决于。

    如果你想访问构造函数的调用者,你应该在构造函数中接收它。

    如果调用者不需要提供该对象,则创建自己。

    这只是设计问题。

    参考视角:

    谈到你的实际问题,当你这样做时

    this.iconColor = iconColor;
    

    您根本没有创建 new 对象,因此它指向您传递的同一个实例。除非您创建 new 对象,否则您仍然指的是传递的对象。

    【讨论】:

    • 我想你理解错了这个问题。问题是他是否应该复制该对象,或者他是否可以保持对它的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2023-02-02
    • 2013-06-04
    • 2019-11-21
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多