2012-05-23 3 views
4

정적 필드의 문제가 있습니다. 근본 원인이 정적 필드의 범위 여야한다고 생각합니다.정적 필드의 범위는 무엇입니까?

프로젝트는 Apache servicemix를 기반으로하며 많은 하위 프로젝트로 구성됩니다.

하위 프로젝트 'A'에서 '등록'클래스의 정적 목록 필드 'reg'와 'add'및 'getAll'과 같은 필드를 조작하는 정적 메서드를 정의했습니다. 하위 프로젝트 A가 배포되면 프로젝트 'A'의 이름이 등록을 위해 정적 목록에 추가됩니다.

문제는 서브 프로젝트 'B'에 관해서, 서브 프로젝트 'B'가 배치 될 때, 그 이름이 등록을위한 정확히 동일한 정적리스트에 추가되기를 원합니다. 하지만 정적 메서드 getAll을 호출하거나 'Registration'에 추가하면 sub-projectB의 'reg'는 sub-projectA의 것과 다릅니다. 따라서 등록 기능이 작동하지 않습니다.

정적 필드의 범위는 무엇입니까? JVM이나 다른 것들에서 유효합니까? 당신의 도움이

답변

8

정적의 범위는 전역에 대한

감사합니다 - 그 소유의 클래스 로더 내에서. JVM은 여러 클래스 로더를 생성하고 각각의 새 클래스 로더에 클래스의 개별 인스턴스를로드 할 수 있습니다.

Statics는 JVM에 대해 글로벌하지 않으며 클래스 로더별로 전역입니다. 정적 필드가있는 클래스가 다른 클래스 로더에로드되면 해당 정적 멤버는 다른 클래스 로더에서 볼 수 없습니다.

프로젝트 A와 프로젝트 B는 어떻게 배포됩니까? 그들은 같은 클래스 로더에 있습니까?

저는 servicemix에 익숙하지 않지만 Java EE 앱이 다른 클래스 로더에 동일한 앱의 다른 버전을 배포하는 것처럼 별도의 클래스 로더에 별도의 앱을 배포한다고 상상합니다. 따라서 앱 1.0과 앱 1.1을 실행할 수 있습니다. 나란히 서서 서로에게 영향을 미치지 않습니다.

이것은 의도적으로 설계된 것입니다.

이 경우 공유 상태를 유지하려면 독립적 인 것이 필요합니다. (예 : 데이터베이스)

관련 문제