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

标签 java oop object constructor

例如,我有以下实现 Icon 接口(interface)的类。在构造函数中,它通过创建参数中提供的 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;
 }

我想知道哪种方式是首选。

最佳答案

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

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

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

this.iconColor = iconColor;

您引用的是同一个对象。

<小时/>

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

我什么时候应该使用其中一种而不是另一种?

在以下情况下使用副本:

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

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

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

关于java - 在构造函数中初始化另一个类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33061885/

相关文章:

java - 如何在有限时间后使购物车过期

java - 检查通用实例?

c# - 当 Liskov Substitution 提到子类型时,它是在谈论 C# 上下文中的派生类吗?

java - MVC模式;我的模型类需要用户输入,但我知道它不应该询问用户或 Controller

javascript - 使用动态计算的名称访问对象属性

java - 将迭代器从 JSONObject 重写为 JSONArray

java - 此类中引用的 Map 是否安全发布?

java - 用于 Eclipse 的 JBPM 3 插件和用于 Eclipse 的 JPBM 4 插件中的弯曲点有什么区别?

java - HangMan 游戏 - 输入所需单词后游戏直接结束

java - 我如何检查java中对象的内存使用情况