3

首先,我很抱歉我的英语。它不是我的主要语言。

class Car {
    private Integer x;

    public Car(){
        this.x = new Integer(5);
    }

    public Integer getInt(){
        return this.x;
    }

    public static void main(String[] args) {
        Car car = new Car();
        Integer x = car.getInt();
        // Here is what annoying me. I want to change the value of car.x only with getInt()
        x += 4;
        system.out.println(""+car.x);
        //This will print 5, when i want it to print 6.
    }
}

这只是一个概念。我需要以这种方式为我的项目更改整数的值。这似乎是不可能的,但我可能会错过一些东西。

我的意思是,如果我能做这样的事情会很有帮助:

Integer x = car.getInt();
x.setValue(9);

这就是使用Java的问题。我喜欢 Java,但在 c++ 中我可以在任何地方使用指针。

如果你想知道为什么我需要使用这个方法,那是因为我有这两个功能:

private Rectangle2D.Double rect;
private Vector3D position;

rect.x应具有与 相同的值position.x。然后,每次我调整其中一个值时,我都必须同时更改它们。这些函数中的每一个都用于不同的方法。我用矩形来渲染,我用位置来计算..

非常感谢!

4

3 回答 3

7

在 Java 中,Integer该类是不可变的,因此您将永远无法更改其实例之一的值。设计就是这样,因此Integer可以安全地共享许多相同的实例。

于 2013-07-28T02:12:56.717 回答
1

如果要修改 x 属性,则必须为 Car 提供 setInt(Integer i) 方法。

于 2013-07-28T02:17:28.657 回答
1

根本问题是Integer对象是不可变的。你需要做的是:

    car.setInt(car.getInt() + 4);

您的代码中实际发生的情况如下:

    Integer x = car.getInt();

这将获取对Integer对象的引用...

    x += 4;

这相当于这个。

    int temp = x.intValue();
    int temp = temp + 4;
    x = Integer.valueOf(temp);

换句话说x += 4,就是创建一个新对象并将其分配给局部变量x。该新对象没有被传回给Car.x实例变量。


还有其他几种替代解决方案:

  • 去掉x局部变量,让main方法直接在car.x. (这在风格上是有问题的,但无论如何你的例子都是非常人为的。)

  • 使用(也许写)一个可变整数持有者类而不是Integer. 但是,这意味着您将无法使用自动装箱/自动拆箱;即x += 4;不再合法。


....我正在寻找替代方案。像 x.setValue(9);

没有一个。原始包装器类型是不可变的。集合操作......或任何其他违反“不变性”不变量的东西是不可能的1

1 - 严格来说,这是不正确的。有办法做到这一点。但是,如果您确实更改了对象的“值”,那么您Integer就有很大的风险会破坏 JVM 中的各种其他东西。该类Integer特别实现了一种优化,自动装箱重用现有Integer实例。因此,如果您设法将Integer包含 8 的对象更改为包含 9 的对象……您可能会将许多其他8 更改为 9。哎呀!!!

于 2013-07-28T02:19:32.760 回答