Я пытаюсь узнать, является ли в 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;
}
}