Java:指令流程不清楚

时间:2010-08-09 20:43:01

标签: java

我正在经历一些随机的java代码并遇到了这个代码,我试图理解流程并且很难理解类的实际执行情况,类的实际操作所以我的基本问题是WhatDoIDo班实际上做了什么?任何指导都将得到推广。

问: 什么是单元测试用例,它解释了由于在并发环境中实现而改进的性能。

代码

public class WhatDoIDo{
    private X x;
    private boolean b;
    private Object o;

    public WhatDoIDo(X x) {
        this.x = x;
    }

    synchronized Object z() {
        if (!b) {
            o = x.y();
            b = true;
        }
        return o;
    }

    public interface X {
        Object y();
    }
}

5 个答案:

答案 0 :(得分:3)

这似乎是简单的记忆:

http://en.wikipedia.org/wiki/Memoization

答案 1 :(得分:2)

WhatDoIDo是一个包装对象o的包装类。

它定义了一个内部interface X,它有一个方法y()来创建Object。可以将此接口视为创建对象的策略。当WhatDoIDo的对象使用new创建时,它的构造函数提供了一个X对象,用于创建对象。

它创建包装对象,并通过z()方法将其提供给客户端代码。它懒洋洋地创建对象。它使用boolean标志b来跟踪对象是否已创建。当客户端调用z()来获取包装对象时,如果设置了该标志,则返回对象o。如果未设置flag,则使用创建此X对象时提供的策略WhatDoIDo创建对象。存储对创建的对象的引用并将其返回给客户端。此外,z()synchronized,因为它创建了对象(如果尚未创建)。如果它没有同步,则两个线程最终可能会创建一个对象,并且只会存储其中一个。

public class ObjectWrapper {
    private CreationStrategy strategy;
    private boolean objectCreated;
    private Object wrappedObject;

    public ObjectWrapper(CreationStrategy strategy) {
        this.strategy = strategy;
    }

    synchronized Object getWrappedObject() {
        if (!objectCreated) {
            wrappedObject = strategy.createObject();
            objectCreated = true;
        }
        return wrappedObject;
    }

    public interface CreationStrategy {
        Object createObject();
    }
}

答案 2 :(得分:0)

synchronized Object z() {
    if (!b) {
        o = x.y();
        b = true;
    }
    return o;
}

这是一种默认可见性(包可见)的方法。它返回一个对象 类型为Object。它的签名包含 synchronized 关键字。这指示了 编译器禁止多个线程同时执行此方法。如果一个线程执行该方法,则该方法已锁定已同步。在原始线程释放此隐式锁定之前,其他线程可能无法执行该方法。

简而言之,synchronized关键字是Java内置的semaphore机制。 (实际上,第二个想法,这个关键字实际上是一个信号量吗?)

答案 3 :(得分:0)

除了迈克说的话 布尔值的默认初始化为false(对于整数,浮点数和双精度数0 - 对象设置为空)。
该方法的作用是第一次调用它时将返回传递给构造函数的X中的对象Y,之后它将返回相同的东西,因为o被赋值给x.y()。

这是家庭作业吗?

答案 4 :(得分:0)

看起来WhatDoIDo类就像一个实现接口X的类的包装器。第一次调用z时,它设置它要返回的对象,并将b设置为true,这样即使xy()也是如此返回null,不再调用xy()。

这样,反复调用z()将返回相同的对象(或null值)。