2011-01-24 2 views
2

정적 클래스라고 불리는 클래스를 어떻게 알 수 있습니까?

class Superclass { static List list() { ... } } 

및 하위 클래스 :

class Subclass extends Superclass { ... } 
class Subclass2 extends Superclass { ... } 

다음과 같이 list 메서드를 호출하고 싶습니다. Subclass.list() 또는 Subclass2.list()과 함께 호출 된 하위 클래스에 따라 다른 작업을 수행합니다.

어떤 하위 클래스가 list 메서드를 호출하는지 알 수있는 방법이 있습니까?

참고 : 각 하위 클래스에서 list 메서드를 재정의 할 필요가 없습니다.

업데이트 : 모두들 이것은 나쁜 디자인이라고 말하고 있으며, 대부분의 경우 그것이 될 것이라고 생각하지만, 제 생각에는 그렇게 생각하지 않습니다. 내 ORM은 java.lang.Class을 취하는 메소드를 정의합니다. 내 ORM의 메서드에 대한 속기를 제공하여 ORM.list(User.class, ...) 대신 User.list(...)을 말할 수있게하려고합니다.

+5

하위 클래스에서 재정의하는 것이 올바른 일처럼 보입니다. 왜 이걸하고 싶지 않니? –

+0

@Oli - Superclass.list 메소드는 기본적으로 getFromDatabase (Subclass.class) 또는 getFromDatabase (Subclass2.class) 등을 호출합니다. 'Superclass'에서 파생 된 클래스가 무엇이든 말하기를 원합니다. 'Subclass.list()'를 호출하여 데이터베이스에서 해당 유형의 목록을 가져옵니다. 'list'만이'Superclass'가 가진 유일한 메소드는 아니기 때문에 각 서브 클래스에서 5 가지 메소드를 오버라이드하고 싶지는 않습니다. – Kyle

+3

@ 카일 : 각각의 파생 된 클래스에서 간단한 보일러 플레이트가 아닌 각 기본 클래스 메소드에서 형식 확인'if-else' 문을 유지해야 할 것입니다. 이것은 광란이다! –

답변

1

인터페이스/구현 문제와 유사합니다.

list() 메소드의 인터페이스를 작성한 다음 두 개의 구현을 작성하고 Subclass는 implementation1을 사용하고 Subclass2는 구현 2를 사용합니다. 모두가 코멘트처럼 내 댓글에

UPDATE

봐, 나는 당신이 당신의 디자인을 재고하고 하나 OLI 상태로 서브 클래스의 메소드를 오버라이드 (override) 또는 만들 필요가 있다고 생각,이 질문에 How do I find the caller of a method using stacktrace or reflection?

체크 아웃 인터페이스와 구현.

+0

하위 클래스에 코드를 작성하고 싶지 않습니다. 'Superclass.list' 메소드는 기본적으로'getFromDatabase (Subclass.class)'또는'getFromDatabase (Subclass2.class)'를 호출하려고합니다. – Kyle

+0

http://stackoverflow.com/questions/421280/in-java - 방법 - 호출자 - 중 - 스택 - 또는 - 반사를 사용하여 찾을 - 나는 - do-do-find-find, 나는 이것이 당신의 상황에서 좋은 패턴/디자인이라고 생각하지 않습니다. –

0

당신은 목록 방법은 ARG을 호출하는 방법을

Subclass.list(type) 

처럼 다음 유형을 테스트 할 수 있습니다. 그 종류의 용감한 생각. 다른 디자인 옵션을 고려하는 것이 좋습니다. 그것은

+0

예, 저는 수업의 유형을 전달할 수 있다고 생각했지만, 전화를 걸 때마다 추가 작업이 필요합니다. 나는이 방법을 멋진 속기로 주로 갖고 싶다. – Kyle

+0

@kyle 형식 일 필요는 없습니다. 또한, 목록은 무엇을합니까? – hvgotcodes

+0

내 질문에 쓴 업데이트를 확인하십시오. – Kyle

1

당신이 서브 클래스는 메소드를 호출 의미합니까 ... 그렇다하더라도 잘 보이지 않는

listForSubclass1 

또는

listForSubclass2 

방법을 만들기 위해 더 나은,하지만 수 있는가? 그럼이 인스턴스 메서드 (정적이 아닌), 추상해야하며 하위 클래스 구현을 제공 할 것입니다.

정적 방법을 재정의 하시겠습니까? 적어도 의미있는 방식으로는 불가능합니다. 수퍼 클래스 정적 메서드를 하위 클래스에서 정의하여 숨길 수는 있지만 실제 상속 관계는 아닙니다.

+0

메서드는 원하는 형식의 데이터베이스에서 목록을 가져옵니다. 그것은 어떤 멤버 변수에 의존하지 않으므로 정적이어야한다고 생각합니다. 기본적으로 Grails 프레임 워크가하는 일을하고 모든 모델 클래스에'User.list()'를 써서 데이터베이스에서 사용자 목록을 얻으려고합니다. 또는'Post.list()'등 – Kyle

0

누가 호출했는지에 관해서 : 이것은 일반적으로 클래스를 호출하는 것을 찾는 것과 다르지 않습니다. 전통적으로이 예외는 예외를 throw하고 catch하고 스택 추적을 체크 아웃하여 수행되었습니다. 그러나 나중에 JDK에는 예외를 throw하지 않고 스택 추적에 액세스하는 메서드가 있습니다 (1.5 이후에 사용 가능한 Thread.getStackTrace()).

1

나는 이것이 가능한 최선의 디자인이 아니라는 데 동의합니다.

다음 코드는

SuperClass.list를 (인쇄해야합니다) - - 어쨌든이 작업을 수행하는 특별한 이유가있는 경우, 여기에 솔루션입니다 서브 클래스에 의해 호출
또는
SuperClass.list() - Subclass2에 의해 호출 됨

... 
    static List list() { 
     System.out.println("SuperClass.list() - called by "+Thread.currentThread().getStackTrace()[3].getClassName()); 
//[3] because you want to skip these last three calls to get to this information -:) 
    } 
... 
+0

나는이 경로를 고려하고 있었지만 Groovy를 사용하고 있으며 스택 추적에 대한 색인은 언어의 동적 특성으로 인해 상당히 다를 수 있습니다. – Kyle

+0

Thread.currentThread(). getStackTrace() 요소를 반복 처리하고 Superclass 하위 클래스의 첫 번째 항목을 중단/반환하는 작은 래퍼를 작성할 수 있습니다. –

관련 문제