java - 为什么 Jersey 会导致单例类无法工作?

标签 java jersey singleton

我实现了这样的东西:

@Path("/svc")
public class Service {

    Resource rsc = Resource.getInstance();

    @GET
    public String doGet() {...}
}

public class Resource {

    public static Resource instance;

    private Resource() {...}

    public static getInstance(){
        if (instance == null){
            return new Resource();
        }
        return instance;
    }
}

Service 类是实现 GETPOST 方法的地方,其中 Resource 是单例类临时存储一些数据的地方。

但是,当我测试它时,我发现单例类每次调用方法时都会获得一个新实例。 singleton 类只是一个经典的 Java 单例实现。我知道添加 @Singleton 注释可以解决问题,但我想知道是什么导致了这种行为?

最佳答案

简短回答

您的单例不是单例

长答案以及如何解决它

instance 字段是 public,并且您始终返回一个新的 Resource 实例,而不是将其分配给 instance字段。

还建议将您的类标记为 final 并在 getInstance() 方法中使用同步:

public final class Resource {

    private static Resource instance;

    private Resource() {

    }

    public static synchronized Resource getInstance() {
        if (instance == null) {
            instance = new Resource();
        }
        return instance;
    }
}

但是,这不是实现单例的最佳方式

更多信息,请参阅What is an efficient way to implement a singleton pattern in Java?

关于java - 为什么 Jersey 会导致单例类无法工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33819231/

相关文章:

java - IllegalStateException - 使用 Gson 使用字符串数组序列化映射

java - Jersey/JAX-RS 项目中的 Gradle 'Could not resolve all dependencies for configuration'

通过 Jersey 发送请求时出现 javax.ws.rs.ProcessingException

java - 将授权 header 添加到 Jersey SSE 客户端请求

swift - 在 Swift 中使用 dispatch_once 单例模型

javascript - 使用javascript单例记录错误

java - 并发、对象可见性

java - 打印斐波那契数列的结果

java - 为什么日期没有保存到我的数据库中?

ruby - 哪个是 Ruby 中最好/最常用的单例编码约定?