存储对象的引用

时间:2016-05-11 12:51:49

标签: java

我想在某个类中存储对变量的引用,并在此类中对其进行操作。操作应该修改原始变量。 特别是下面的代码应该打印1而不是0。

class Test {
    private Long metric;

    public Test(Long m) {
        this.metric = m;
        ++this.metric;
    }
}

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Long metric = 0L;
        Test test = new Test(metric);
        System.out.println(metric);
    }
}

如何实现这种行为?

3 个答案:

答案 0 :(得分:5)

您可以将Long替换为可变的AtomicLong。你会丢失自动装箱功能。

答案 1 :(得分:2)

代码中的问题是 Integer是一个不可变的类。 每次更改值时,您实际上都在构建一个新的Integer实例。

对可变对象执行相同操作将起作用。

例如

class Test {
    private StringBuilder metric;

    public Test(StringBuilder m) {
        this.metric = m;
        this.metric.append(" Xter");
    }
}

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        StringBuilder b = new StringBuilder("Hello ");
        Test test = new Test(metric);
        System.out.println(b.toString());
        // Will print Hello Xter
    }
}

答案 2 :(得分:0)

正如已经提到的,原始包装类是不可变的。

由于您的度量标准在Test中是私有的,并且您希望在调用方法main中使用它的值,因此您应该使用java bean准则并为其使用getter:

public Long getMetric(){return this.metric;}

主要:

metric=test.getMetric();
System.out.println(metric);