Является ли статический класс в пределах одноэлементного класса, также одноэлементным? - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь узнать, является ли в Java 8 вложенный статический класс в контроллере (одноэлементный класс) также статическим и может ли он использоваться совместно между запросами?

Это устаревший код, который я очищаю из-за возможного состояния гонки: контроллер имел несколько закрытых полей. Я переместил их в статический вложенный класс и создавал экземпляр этого класса каждый раз, когда запрос попадает в контроллер. Затем я передаю этот объект частным методам для расчетов.

Мне говорят, что статические вложенные классы в синглетах имеют только один экземпляр подкласса в памяти, и если на него воздействуют 2 запроса, второй будет зависать. Также будучи предупрежденным, что кто-то может переместить этот статический класс наружу, что не является хорошим подходом для принятия (?)

Существует множество ответов относительно разницы между статическим классом и синглетонами. Нашли в документации Oracle: По сути, статический вложенный класс по поведению является классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки.

=== Но я не нашел ничего о статическом вложенном классе в одиночном коде ===

Я попробовал это: приостановил поток в handleRequest и запустил второй, и обнаружил, что экземпляры статического вложенного класса отличаются и содержат разные значения. Это то, что я ожидаю, учитывая документацию, но я точно не знаю, потому что я не могу найти ничего о статическом вложенном классе 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;
  }
}

1 Ответ

5 голосов
/ 08 мая 2019

Статический вложенный класс ничем не отличается от класса верхнего уровня: каждый раз, когда вы используете new для создания экземпляра, вы ... создаете экземпляр.Если вы создаете экземпляр более одного раза, то по определению это не одиночка.Факт, что это создано из синглтона, абсолютно не имеет значения.В JVM даже нет понятия синглтона: это просто архитектурный выбор.

...