单例class内的staticclass,也是单例吗?
Is a static class within a singleton class, also singleton?
我正在尝试了解在 Java 8 中,控制器(单例 class)中的嵌套静态 class 是否也是静态的并且可以在请求之间共享?
这是我正在清理的遗留代码,因为可能存在竞争条件:控制器有多个私有字段。我将它们移动到静态嵌套 class 并在每次请求到达控制器时创建该 class 的实例。然后我将该对象传递给私有方法进行计算。
有人告诉我,单例中的静态嵌套 classes 在内存中只有一个 sub-class 实例,如果它被 2 个请求命中,第二个将坚持.还被警告有人可以将此静态 class 移到外面,这不是采取 (?)
的好方法
关于静态 class 和单例之间的区别有很多答案。在 Oracle 文档上发现:实际上,静态嵌套 class 在行为上是嵌套在另一个顶级 class 中以方便打包的顶级 class。
=== 但是我还没有发现任何关于静态嵌套 class 在单例中的信息 ===
我试了一下:在 handleRequest 中暂停一个线程并启动第二个线程,发现静态嵌套 class 的实例不同并且包含不同的值。鉴于文档,这是我所期望的,但我不确定,因为我找不到任何关于静态嵌套 class WITHIN A SINGLETON.
的信息
我错过了什么吗?这有可能失败吗?有更好的解决方案吗?
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;
}
}
静态嵌套 class 与 top-level class 没有什么不同:每次使用 new
创建实例时,您...创建一个实例.如果您多次创建实例,那么根据定义,它不是单例。它是从单例创建的这一事实完全无关紧要。 JVM 甚至没有单例的概念:它只是一种架构选择。
我正在尝试了解在 Java 8 中,控制器(单例 class)中的嵌套静态 class 是否也是静态的并且可以在请求之间共享?
这是我正在清理的遗留代码,因为可能存在竞争条件:控制器有多个私有字段。我将它们移动到静态嵌套 class 并在每次请求到达控制器时创建该 class 的实例。然后我将该对象传递给私有方法进行计算。
有人告诉我,单例中的静态嵌套 classes 在内存中只有一个 sub-class 实例,如果它被 2 个请求命中,第二个将坚持.还被警告有人可以将此静态 class 移到外面,这不是采取 (?)
的好方法关于静态 class 和单例之间的区别有很多答案。在 Oracle 文档上发现:实际上,静态嵌套 class 在行为上是嵌套在另一个顶级 class 中以方便打包的顶级 class。
=== 但是我还没有发现任何关于静态嵌套 class 在单例中的信息 ===
我试了一下:在 handleRequest 中暂停一个线程并启动第二个线程,发现静态嵌套 class 的实例不同并且包含不同的值。鉴于文档,这是我所期望的,但我不确定,因为我找不到任何关于静态嵌套 class WITHIN A SINGLETON.
的信息我错过了什么吗?这有可能失败吗?有更好的解决方案吗?
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;
}
}
静态嵌套 class 与 top-level class 没有什么不同:每次使用 new
创建实例时,您...创建一个实例.如果您多次创建实例,那么根据定义,它不是单例。它是从单例创建的这一事实完全无关紧要。 JVM 甚至没有单例的概念:它只是一种架构选择。