Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在构造函数中初始化另一个类的对象_Java_Oop_Object_Constructor - Fatal编程技术网

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

Java 在构造函数中初始化另一个类的对象,java,oop,object,constructor,Java,Oop,Object,Constructor,例如,我有一个实现Icon接口的类。在构造函数中,它通过创建参数中提供的颜色对象的深度副本来初始化颜色对象 public class CircleIcon implements Icon { private Color iconColor; private int radius; public CircleIcon(Color iconColor, int radius) { this.iconColor = new

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

   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获取参数中提供的颜色对象的引用,而不是其副本

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

我想知道哪种方式更可取。

在设计角度:

答案是要看情况而定

如果您想授予构造函数调用方访问权,您应该在构造函数中收到该访问权

若不需要调用方提供该对象,则创建自己

那只是设计的问题

在引用透视图中:

说到你的实际问题,当你这么做的时候

this.iconColor = iconColor;

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

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

this.iconColor = new Color(iconColor.getRGB());
正如你所说,你正在复印一份。
当你这么做的时候

this.iconColor = iconColor;
您指的是同一个对象


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

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

在下列情况下使用副本:

  • 实例状态的更改将使您自己的类的状态无效
在以下情况下使用相同的实例:

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

我想你理解错了这个问题。问题是他是否应该复制对象,或者他是否可以只维护对它的引用。在构造函数中创建对象(而不是作为参数)以供以后的方法使用怎么样。对吗?我们是否需要在将使用该方法的方法中直接创建该对象?谢谢