gpt4 book ai didi

java - 单例类中的静态类也是单例吗?

转载 作者:行者123 更新时间:2023-12-01 16:44:12 25 4
gpt4 key购买 nike

我正在尝试了解在 Java 8 中, Controller 中的嵌套静态类(单例类)是否也是静态的并且可以在请求之间共享?

这是我正在清理的遗留代码,因为可能存在竞争条件: Controller 有多个私有(private)字段。我将它们移至静态嵌套类,并在每次请求到达 Controller 时创建该类的实例。然后我将该对象传递给私有(private)方法进行计算。

有人告诉我,单例中的静态嵌套类在内存中只有一个子类实例,如果它受到 2 个请求的命中,则第二个请求将保留。还被警告有人可以将这个静态类移到外面,这不是一个好的方法(?)

关于静态类和单例之间的区别有很多答案。在Oracle文档上发现:实际上,静态嵌套类在行为上是一个顶级类,为了打包方便而嵌套在另一个顶级类中。

=== 但我还没有在单例中找到任何关于静态嵌套类的信息 ===

我尝试了一下:在handleRequest中暂停一个线程并启动第二个线程,发现静态嵌套类的实例不同并且包含不同的值。根据文档,这是我所期望的,但我不确定,因为我找不到有关单例中静态嵌套类的任何信息。

我错过了什么吗?这有可能会失败吗?有更好的解决办法吗?

public class MyController extends WebContentGenerator implements Controller {

@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
ReportParameters params = new ReportParameters();
initVars(request, params);
doWork(params);
return null;
}

private void initVars(HttpServletRequest request, ReportParameters params)
{
params.flag = "Y".equals(request.getParameter("flag"));
params.message = "Hello world";
}

private void doWork(ReportParameters params)
{
if (params.flag)
params.message = "foo";
}

private static class ReportParameters
{
private boolean flag;
private String message;
}
}

最佳答案

静态嵌套类与顶级类没有什么不同:每次使用new创建实例时,您...创建了一个实例。如果您多次创建一个实例,那么根据定义,它不是单例。它是从单例创建的这一事实完全无关紧要。 JVM 甚至没有单例的概念:它只是一种架构选择。

关于java - 单例类中的静态类也是单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56030718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com