2014-04-25 3 views
3

에 대한 자바의 상당 인스턴스 (싱글 방법)루비 루비의 싱글

class C;end 

v1,v2 = C.new, C.new #=>two instances of class C 

def v1.meth 
    puts "I am only available in instance v1" 
end 

puts v1.meth #=> prints -> I am only available in instance v1 
puts v2.meth #=> throws -> undefined method 'meth' 

자바에서 동등한은 무엇입니까 특정입니다, 내가 방법을 만들 수 있습니다 무엇입니까?

+1

Ruby에서 Java로 이동했습니다 ... :) –

+1

이상한 종류입니다. 저는 Ruby에 대해 잘 모릅니다.하지만 CS 세계의 나머지 부분에서 이해할 수있는 Singleton 패턴은 아닙니다. 나는 이것을 인스턴스 - 특정 메소드라고 부른다 (자바에 상응하는 메소드가 없다). 나머지 세계가 이해할 수있는 * 싱글 톤 *은 클래스의 인스턴스가 하나만 존재할 수있는 경우입니다. 루비가 정말로 "싱글 톤"의 의미를 바꾸고 있습니까? 편집 : 분명히 그렇게. 그것은 끔찍한 행동입니다. – CPerkins

+0

@CPerkins : 당신이 무엇을 얻고 있는지 잘 모르겠습니다. 첫째, Ruby와 Java는 다른 언어입니다. 상황이 다르게 작동합니다. 이는 "끔찍한 실행"이 아니라 정상적인 것입니다. 둘째, 싱글 톤 객체, 싱글 톤 클래스 및 싱글 톤 메소드 간의 차이점은 분명합니다. 셋째, 싱글 톤 클래스는 인스턴스를 하나만 가질 수 있습니다. 넷째, "싱글 톤"은 일반적인 영어 단어로 "일회성"을 의미합니다. Ruby에서 싱글 톤 메소드와 싱글 톤 클래스가하는 일에 대한 완벽한 설명입니다.마지막으로 : Ruby는 Java보다 오래되었으므로 의미가 변경된 Java가 있습니다. –

답변

4

가장 가까운 방법은 익명의 수업을받는 것입니다.

class C {} 

C v1 = C() { 
    void meth() { 
     puts("I am only available in instance v1"); 
    } 
}; 
C v2 = new C(); 

// prints -> I am only available in instance v1 
v1.getClass().getMethod("meth").invoke(v1); 
// throws NoSuchMethodException 
v2.getClass().getMethod("meth").invoke(v2); 

자바 (8)에서는 자연 자바 메서드 호출에서

interface C { 
    void meth(); 
} 

C v1 =() -> puts("I am only available in instance v1"); 
C v2 =() -> { throws new UnsupportedOperationException(); } 

v1.meth(); 
v2.meth(); 

정적으로 체크를 쓸 수 있습니다 당신은 컴파일러가 존재 판별 할 수있는 방법을 호출 할 수 없습니다. (위와 같은 반향으로이를 수행 할 수 있습니다.)

+0

오, 그래 반사 - 익명의 서브 클래스에서 새로운 메소드에 액세스하는 것을 생각하지 않았습니다.주의 : 감사는 위험하며 가볍게 또는 악의적으로 사용해서는 안됩니다 (예 : 프레임 워크의 가시성 제한을 우회하기 위해) . – hiergiltdiestfu

+0

@hiergiltdiestfu 나는 반성을 피해야한다는 것에 동의하지만 정적 유형 검사를하지 않는 것도 동의합니다. ;) –

+1

루비와 같은 뜻인가요? : D – hiergiltdiestfu

0

내가 아는 한 Java에는 그런 것이 없다!

1

전략 패턴과 같은 것을 사용해보십시오. UnsupportedOperationException을 Throw하는 디폴트의 방법을 구현에 제공합니다. 물론 이것은 이러한 "싱글 톤 방법"을 동적으로 추가 할 수 없다는 것을 의미합니다. 미리 메서드를 만들어야합니다.

0

클래스의 익명 하위 클래스에 메서드를 추가 할 수 있습니다.이 메서드는 "해당 인스턴스에서만 메서드가 사용 가능합니다"와 같은 느낌을줍니다.

해당 메소드는 클래스의 알려진 계약에서 누락 되었기 때문에 외부에서 액세스 할 수 없지만 동일한 익명 서브 클래스의 해당 인스턴스에서 다른 재정의 된 메소드에 의해 호출 될 수 있습니다.

이 같을 것이다 :

List<String> list = new LinkedList<String>(){ 
     @Override 
     public int size() { 
      if (this.contains("fox")) 
       return sizeOfFox(); 

      return super.size(); 
     } 

     private int sizeOfFox() { 
      return 4; 
     }}; 

} 

당신은 해당 인스턴스에서만 사용할 수있는 추가적인 방법을 수행 LinkedList의 익명의 하위 클래스 작성 : sizeOfFox()합니다. "fox"과 같은 문자열이 목록에 포함될 때마다이 메서드는 size() 메서드의 재정의 된 버전에서 호출됩니다.

실제 사용은 제한되어 있으며 루비 싱글 톤 방법과 비교할 수 없습니다. 대부분의 경우, 이러한 구현은 추상 리스너 - 인터페이스 등을 인스턴스화하고 코드 경로를 추출하여 중앙 메소드를 깨끗하게 유지할 때 사용됩니다.

NB : Java에서 "싱글 톤"은 일반적으로 Singleton Design Pattern을 적용한 결과로 정의됩니다.