我正在经历一些随机的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();
}
}
答案 0 :(得分:3)
这似乎是简单的记忆:
答案 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值)。