【发布时间】:2013-09-11 18:09:36
【问题描述】:
我希望我的类只有一个实例,Format1 应该通过类 Engine 返回:
public final class Engine {
private static Format format;
public Engine(final Param1 param1, final Param2 param2) {
Engine.format = new FormatV1(param1); // FormatV1 implements Format
}
static Format getFormat(int condition) {
switch(condition) {
case 1 : return format;
}
}
}
这是否确保通过 getFormat 只返回一个正确的 Format 实例?
另外,调用 getFormat() 的客户端需要在格式对象上执行方法(它绝对没有状态),但将一个 ByteBuffer 传递给该方法(这个 ByteBuffer 可能会被修改):
class Client
{
public static void main(String[] args) {
Format obj = Engine.getFormat(1); // some param
ByteBuffer buffer; // read data from disk
synchronized (obj) {
long[] result = obj.method(buffer);
if (result == null) {
// do something
}
}
}
}
这里/这样的同步构造是否确保可序列化?
P.S:我对 Java 很陌生,据我所知,我也可以使方法同步,但我认为检查(结果 == null)也应该包含在关键部分中,所以我决定使用而是同步(obj)构造。如果这是一个愚蠢的问题,请原谅我,但我想确认我的怀疑。
【问题讨论】:
-
实际上你的方法
getFormat是基于一个条件的,所以它不会返回一个单例,除非你总是使用相同的参数(在这种情况下是1) -
单例类不应有公共构造函数。
-
我理解并且我将始终发送相同的参数。另外,我知道这不完全是单例。但我想要的是每次 BTSEngine 收到请求时都应该返回相同的对象。
标签: java static synchronization synchronized synchronized-block