簡體   English   中英

單例類(也是單例)中是否有靜態類?

[英]Is a static class within a singleton class, also singleton?

我試圖了解在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;
  }
}

靜態嵌套類與頂級類沒有什么不同:每次使用new來創建實例時,都需要創建一個實例。 如果創建一個實例不止一次,那么根據定義,它不是單例。 從單例創建的事實在競爭上是無關緊要的。 JVM甚至沒有單例的概念:這只是一種體系結構選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM