2009-07-01 3 views
0

Просматривая некоторый код Java, и это просто не кажется правильным. Для меня это выглядит как каждый раз, когда вы вызываете проекты, вы получите новый HashMap, так что это утверждение всегда ложноСтатический метод в Java

projects.get(soapFileName) != null 

Кажется, что он должен иметь поле подкладочного

public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject>(); 

public Object[] argumentsFromCallSoapui(CallT call, Vector<String> soapuiFiles, HashMap theDPLs,int messageSize) 
{ 
    try { 
     for (String soapFileName:soapuiFiles){ 
      System.out.println("Trying "+soapFileName); 
      WsdlProject project ; 
      if (projects.get(soapFileName) != null){ 
       project = projects.get(soapFileName); 
      } else { 
       project = new WsdlProject(soapFileName); 
       projects.put(soapFileName,project); 
      } 
     } 
    } ... 
} 
+0

Подождите, в чем вопрос? –

+0

Упс, прочитайте его как метод, так как он был смешан в середине методов. –

ответ

3

Неа. В Java статическая переменная только инициализируется один раз.

Итак, эта линия будет вызвана только один раз.

public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject>(); 
0

Вы не получите новый HashMap каждый раз, когда вы вызываете метод проектов, если это то, что вы имеете в виду. Новый HashMap будет создан один раз, однако все экземпляры класса будут совместно использовать один HashMap.

2

Вы не звонокprojects - это поле, а не способ.

Поскольку это статическое поле, оно будет инициализировано ровно один раз (по модулю того же типа, который загружается в несколько загрузчиков классов).

+0

Возможно, он имел в виду использование:/ – AlbertoPL

+0

Вполне возможно - но это важное различие. –

3

проекты переменная будет инициализирована один раз, когда класс загружается первым.

Как правило, статические карты такого типа - плохая идея: они часто превращаются в утечки памяти, поскольку вы держите записи задолго до их полезного срока службы.

В этом конкретном случае я также беспокоюсь о безопасности потоков. Если у вас есть несколько потоков, вызывающих этот метод (что, скорее всего, в коде, относящемся к веб-службам), вам нужно будет синхронизировать доступ к карте или вы можете повредить ее.

И, в общем стилистическом отметить, что это хорошая идея, чтобы определить переменные, используя наименьшее ограничительный класс: в этом случае интерфейс Карта, а не конкретный класс HashMap.

+0

Это не поточно-безопасный. Он просачивается. Трудно проверить. Коренная проблема заключается в том, что изменчивая статика указывает на плохой дизайн. –

+0

Да, по крайней мере, реализация должна быть переключена на ConcurrentHashMap - но даже это не устранит другие потенциальные проблемы. –

1

если добавить статический Инициализатор (статический конструктор?), Вы будете в состоянии видеть, что статика просто инициализируется в первый раз загружается класс:

public class Hello { 
    static { System.out.println("Hello static World!"); } 

    ... 
} 
+0

Статический инициализатор –

Смежные вопросы