문제

일부 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!"); }

    ...
}

프로젝트에서 메소드를 호출 할 때마다 새로운 해시 맵을 얻지 못합니다. 새로운 해시 맵이 한 번 생성되지만 클래스의 모든 인스턴스는 단일 해시 맵을 공유합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top