2009-04-28 4 views
25

같은 클래스의 여러 개체 인스턴스간에 개체를 공유하고 싶습니다.Java에서 정적 필드의 정확한 의미는 무엇입니까?

개념적으로, 내 프로그램은 클래스의 모든 객체 액세스 클래스 B의 동일한 개체를 실행하는 동안

내가 static 시스템 전체 것을 본 적이과 그 사용이 낙담된다. 즉, 클래스 A의 객체를 인스턴스화하는 동일한 JVM에서 실행중인 다른 프로그램이 있으면이 객체는 이전 프로그램에서 액세스 한 객체와 동일한 B 객체에 액세스 할 수 있습니다.

일반적으로 정적 필드 사용의 결점은 무엇입니까?

구현이 많이 필요하지 않은 대안이 있습니까?

+1

정적이 넓은 JVM 그래서 그래 당신은 그들이 같은 객체 B –

+8

누누 acessing해야 같은 VM에서 두 프로그램이있는 경우 : 다양한 클래스 로더 인스턴스를. –

답변

55

정적은 "모든 인스턴스에서 공유"를 의미하지 않습니다 - "특정 인스턴스와 전혀 관련이 없음"을 의미합니다. 즉, 인스턴스를 만들지 않고 클래스 A의 정적 필드에 도달 할 수 있습니다.

동일한 JVM 내에서 두 개의 프로그램을 실행하는 경우는 실제로 "두 개의 프로그램 실행"이 무엇을 의미하는지에 달려 있습니다. 정적 필드는 이고 실제로는이 클래스 객체와 연관되어 있으며 클래스 객체는 클래스 로더와 연관되어 있습니다. 따라서이 두 프로그램이 별도의 클래스 로더 인스턴스를 사용하면 두 개의 독립적 인 정적 변수가 생깁니다. 두 클래스가 동일한 클래스 로더를 사용하면 하나만 존재하므로 서로의 변경 사항을 볼 수 있습니다.

대안으로 - 다양한 옵션이 있습니다. 하나는 "공유"객체에 대한 참조를 생성 한 객체의 생성자에 전달하는 것입니다. 그러면 나중에 해당 참조를 저장해야합니다. 이것은 약간의 고통이 될 수 있으며 정적 접근 방식보다 약간 더 많은 메모리를 흡수하지만 쉽게 테스트 할 수 있습니다.

+0

대안에 감사드립니다 ... 그 전에 내가했던 것을 잊어 버렸습니다 ...하지만 공유 객체를 전달할 수있는 생성자는 더 이상 라이브러리에서 사용할 수 없습니다. – LB40

2

정적 메서드와 멤버는 너무 자주 사용되기 때문에 권장되지 않지만 정적 메서드가 올바른 방법 인 것처럼 들립니다. 여러 프로그램에서 공유되는 정적에 대해서는 그렇지 않습니다. 각 프로그램은 완전히 별개의 환경에서 실행됩니다.

-1

당신이 찾고있는 것을 Singleton Pattern이라고합니다.

+2

그는 아무 것도주지 않았습니다. B 클래스의 게으른 인스턴스 생성을위한 요구 사항. Singleton의 과도한 적용은 분노를줍니다. – Welbog

+0

싱글 톤을 사용하는 유일한 이유는 게으른 인스턴스 생성이 아닙니다. 다른 객체들, 즉 이름을 공유하기 위해 클래스의 단일 인스턴스가 필요한 경우에도 유용합니다. –

+3

그 단일 인스턴스를 얻으려면 Static으로 충분합니다. 그것이 정적 인 것입니다. 싱글 톤은 특히 단일 인스턴스를 원할 때 느리게 인스턴스화해야 할 때 사용됩니다. 이것이 필요하지 않을 때 Singleton을 사용하는 것은 싱글 톤의 잘못된 적용입니다. – Welbog

-1

모든 클래스가 동일한 클래스 로더에 있다고 가정하면 monostate 패턴을 사용하면 어떨까요?

 

    public class Monostate { 

     private static String str = "Default"; 

     public String getString() { 
      return str; 
     } 

     public void setString(String s) { 
      str = s; 
     } 
    } 

그런 다음 당신은 당신이 원하는대로 monostate의 많은 인스턴스를 만들 무료입니다,하지만 그들은 모두 공유 정적 참조로 인해 동일한 기본 객체 :

귀하의 정적 공유는 monostate에 숨겨져 있습니다.

 
    Monostate mono = new Monostate(); 
    mono.setString("Fred"); 
    System.out.println(mono.getString()); 
+0

왜 안 되니? 그것이하는 일에 대해 거짓말을하기 때문입니다. 그것은 싱글 톤 "패턴"을 현명한 것으로 만듭니다. –

+0

내가하려고 한 것은 LB에게 대안을 제시하는 것인데, 이는 그가 요청한 것입니다. 위의 예제가 너무 단순하다는 것일 수도 있습니다. 아마도 monostate와 singleton을 비교하고 대조하는 Robert Martin의이 문서는 도움이 될 것입니다. http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf –

관련 문제