猿问

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

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


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


有人告诉我,单例中的静态嵌套类在内存中只有一个子类的实例,如果它被 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;

  }

}


繁星淼淼
浏览 151回答 1
1回答

慕容3067478

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

相关分类

Java
我要回答