2013-10-01 2 views
5

대부분의 Singleton 클래스와 마찬가지로 private 생성자를 사용하여 클래스를 "확장"하는 표준 기술이 있습니까? 구체적으로 말하자면, java.lang.management.ThreadInfo 클래스를 확장하려고 시도하고 있습니다. 왜냐하면이 클래스를 고유성을 제어하기 위해 HashSet에 추가하기 때문입니다. 그러나 두 스레드가 동일하면 결정하는 방법은 다르며 equals() 메서드의 기본 구현과 동일하지 않습니다.개인 생성자를 사용하여 클래스를 확장하는 기술

이 경우 클래스 확장은 분명히 옵션이 아닙니다.

는 생성자에서 ThreadInfo을 허용하는 래퍼 클래스처럼 뭔가를 할 합리적 후 수동으로 다음의 값으로 모든 관련 필드를 채 웁니다 equals()hashCode()을 무시하거나,이 작업을 수행 할 수있는 더 좋은 방법이겠습니까?

class ThreadInfoWrapper { 

    private ThreadInfo info; 
    ThreadInfoWrapper(ThreadInfo info) { 
     this.info = info; 
    } 

    //Populate instance variables with Thread.State, thread ID, etc.. with 
    //Getters/setters and all that other stuff 

    public boolean equals(Object o) { //Unique implementation 
    } 

    public int hashCode() { //Whatever implementation 
    } 

} 

을하지만 몇 가지 기본적인 기능을 달성하기 위해 매우 로터리 방식 같은 느낌이 같은

뭔가 내가 쓰기 시작 했어,하지만 더 나은 구현이 이상적 일 것이다 것입니다. Java 표준 라이브러리에는 사용자 정의 Comparator가있는 Sets의 구현이 존재하지 않습니다. 나는 내 자신의 해시 집합 구현을 쓸 수 있다고 생각하지만 그것은 단순한 상황에서 너무 많은 일이다. 모든 통찰력이 도움이 될 것입니다.

+0

저는 이러한 클래스를 확장 할 수 없다고 확신합니다. –

+0

@JakobWeisblat 실제로 이러한 클래스는 확장 될 수 있지만 이러한 상황에서는 도움이되지 않는 내부 클래스에 의해서만 확장 될 수 있습니다. 내 클래스 파일에서 확장하는 것이 효과가 없다는 것을 이해합니다. 합리적인 대안을 찾고 특히 표준 사례가 있는지 알아 보겠습니다. 나는 조금을 찾은 후에 아무 것도 찾을 수 없었다. 그러면 – Kon

+0

행운을 빕니다. –

답변

2

확장하면 개인 생성자를 수퍼 클래스 생성자로 사용하는 파생 클래스를 만드는 방법을 의미합니다. 당신은 그렇게 할 수 없습니다. 유능한 프로그래머들이 JRE 수업을 작성했기 때문에 이에 대한 좋은 이유가 있습니다. 따라서 반사 또는 바이트 코드 조작과 같은 속임수를 사용하여 문제를 해결할 수 있다고하더라도 그렇게해서는 안됩니다.

하지만 모두 손실되지 않습니다. 어쨌든 상속에 대한 구성을 선호해야합니다. 데코레이터와 프록시 디자인 패턴이 유용 할 수 있습니다 (예를 들어 이것들에 가깝습니다).

1

나는 다른 옵션이 거의 없다는 점을 고려하여 귀하가하고있는 일이 합리적이라고 생각합니다.

다른 방법으로는 기본값 대신 "특별한"같음을 사용하는 HashMap의 하위 클래스를 작성할 수 있습니다. (이미이 작업을 수행하는 아파치 나 구아바 구현이있을 수 있습니다 - 사람이 렇게 알고)

(나중에 추가)

내가 게으른 및 ThreadInfo에 모든 게터을 가지고 있기 때문에 노출 상당히 "안전"그래서 때문에 나는 어떤 게터도 세터와 래퍼 클래스는 매우 간단하게 유혹 할 것 :

public class ThreadInfoWrapper { 

// public so an outsider can get at the wrapped ThreadInfo 
// could be private if you are sure that will never be necessary 
public final ThreadInfo threadInfo; 

public ThreadInfoWrapper(ThreadInfo threadInfo) { 
    this.threadInfo = threadInfo; 
} 

public boolean equals(Object o) { //Unique implementation 
    // refer to threadInfo.blah... 
} 

public int hashCode() { //Whatever implementation 
    // refer to threadInfo.blah... 
} 

}

그러나, 이것은 당신이 당신의 등호 및 해시 코드에 사용하는 단지 어떤 정보에 따라 달라집니다.

+0

응답 해 주셔서 감사합니다. 내가 검색 할 때, 나는 구아바가 Set의 구현을 가지고 "특별히 거부했다"고 주장하면서이 응답 (http://stackoverflow.com/questions/14880450/java-hashset-with-a-custom-equality-criteria)을 발견했다. equals() 메소드와 양립 할 수없는 equality criteria를 가지고있다. – Kon

+0

연구를 수행 한 것처럼 들립니다. 행운을 빕니다. – user949300

관련 문제