首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象作为参数传递时使其不可变

将对象作为参数传递时使其不可变
EN

Stack Overflow用户
提问于 2013-04-19 17:34:03
回答 6查看 5.8K关注 0票数 6

当对象作为参数传递时,我是否可以使其不可变,以便被调用的方法不能更改它,但被调用者可以更改它?

所以我有这样的东西:

代码语言:javascript
复制
Class Car {
  Wheel wheel_1;

  Axis axis = new Axis(wheel_1);
}


Class Wheel {
  int size;

  setSize(int size) {}
  int getSize() {}      
}

现在我造了一辆有轮子的车。然后在car类中,我想构造一个轴。

为此,我将wheel_1传递给Axis的构造函数。

现在我的问题是:我能保证Axis的构造函数不会改变wheel_1的大小,但是car类可以改变它吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-04-19 17:37:46

是。通常,这是通过对Wheel类使用copy-constructor来完成的。

例如:

代码语言:javascript
复制
wheel_1 = new Wheel(wheel);

请记住,Wheel类需要以支持这一点的方式编写。也就是说,它应该提供一个复制构造函数。

注意:这并没有使对象成为不可变的。它只是生成了一个副本,不能被您的类以外的任何东西编辑。

如果您从任何其他方法返回Wheel实例,请确保在退出的过程中也以防御性方式复制它:

代码语言:javascript
复制
Wheel getWheel() {
  return new Wheel(wheel_1);
}

最后,值得一提的是,只要有可能,创建不可变的类总是一个好主意。所以也许你可以通过让Wheel变得不可变来避免这个问题?

票数 5
EN

Stack Overflow用户

发布于 2013-04-19 17:47:39

使Wheel类不可变。然后,在需要新大小时让Car对象创建一个新的Wheel对象。

代码语言:javascript
复制
public final class Wheel {
    private final int size;

    public Wheel(int size) {
        this.size = size;
    }

    public int getSize() {
        return size;
    }
}

现在,您可以将轮子对象传递给Axis,而不会出现任何问题。

代码语言:javascript
复制
public class Car {
    private Wheel wheel;
    private Axis axis;

    public Car(int initialWheelSize) {
        wheel = new Wheel(initialWheelSize);
        axis = new Axis(wheel);
    }
}
票数 5
EN

Stack Overflow用户

发布于 2013-04-19 17:38:16

wheel_1的副本传递给Axis构造函数。

代码语言:javascript
复制
class Car {
    Wheel wheel_1;

    Axis axis = new Axis(new Wheel(wheel_1));
}

此外,Wheel还需要一个构造函数,该构造函数接受另一个Wheel对象并复制其属性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16101577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档