在构造函数中初始化另一个类的对象

时间:2015-10-11 05:34:32

标签: java oop object constructor

例如,我有以下类实现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;
 }

我想知道哪种方式更受欢迎。

2 个答案:

答案 0 :(得分:1)

从设计角度来看:

答案取决于。

如果要授予构造函数调用者的访问权限,则应在构造函数中接收该函数。

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

这只是设计问题。

参考视角:

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

this.iconColor = iconColor;

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

答案 1 :(得分:1)

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

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

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

this.iconColor = iconColor;

您指的是同一个对象。

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

我应该何时使用另一个?

何时使用副本

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

时使用相同的实例
  • 该实例是不可变的。
  • 实例状态的更改不会对您的班级状态产生任何影响。