문제
일부 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);
}
}
} ...
}
해결책
아니요. Java에서는 정적 변수가 한 번만 초기화됩니다.
따라서이 줄은 한 번만 호출됩니다.
public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject> ();
다른 팁
그만큼 프로젝트 클래스가 처음로드 될 때 변수가 한 번 초기화됩니다.
일반적으로, 이런 종류의 정적 맵은 나쁜 생각입니다. 유용한 수명을 지나서 오랫동안 항목을 잡을 때 종종 기억 누출로 변합니다.
이 특별한 경우에는 스레드 안전에 대해서도 걱정합니다. 이 메소드를 호출하는 여러 스레드가있는 경우 (웹 서비스를 다루는 코드에있을 가능성이 높음) 맵에 대한 액세스를 동기화하거나 손상시킬 수 있습니다.
그리고 일반적인 문체 음표에서 가장 제한적인 클래스를 사용하여 변수를 정의하는 것이 좋습니다.이 경우 인터페이스 지도, 콘크리트 클래스보다는 해시 맵.
당신은 그렇지 않습니다 전화 projects
- 방법이 아닌 필드입니다.
정적 필드이므로 정확히 한 번 초기화됩니다 (여러 클래스 로더에 동일한 유형을 모듈로 모듈로).
정적 이니셜 라이저 (정적 생성자?)를 추가하면 클래스가 처음로드 될 때 정적이 초기화되어 있음을 알 수 있습니다.
public class Hello {
static { System.out.println("Hello static World!"); }
...
}
프로젝트에서 메소드를 호출 할 때마다 새로운 해시 맵을 얻지 못합니다. 새로운 해시 맵이 한 번 생성되지만 클래스의 모든 인스턴스는 단일 해시 맵을 공유합니다.
제휴하지 않습니다 StackOverflow