2010-05-15 7 views
5

이것은 상당히 주관적인 질문 일 수도 있지만 그렇지 않을 수도 있습니다. 내 응용 프로그램에는 다른 시간에 사용자에게 표시되는 양식 모음이 있습니다. 각 양식은 자체적 인 클래스입니다. 일반적으로 사용자는 단추를 클릭하여 새 양식을 시작합니다.Java reflection 적합성

buildButton("button text", new SelectionAdapter() { 
    @Override 
    public void widgetSelected(SelectionEvent e) { 
     showForm(new TasksForm(args...)); 
    } 
    }); 

나는 시간이 수십을, 그리고 그것은 SelectionAdapter마다 시간을 확인하는 데 정말 성가신 :

내가이 버튼을 구축하는 편리한 기능을 가지고, 당신은 다음과 같이 호출.

buildButton("button text", TasksForm.class, args...); 

인수 :

정말 내가 알 수있는 버튼에 필요한 모든는 클릭이고 어떤 인수 생성자를 제공 할 때의 인스턴스를, 그래서 내가 대신이 같은 전화 기능을 내장 무엇 클래스입니다 TasksForm을 정상적으로 인스턴스화하는 데 사용할 수있는 임의의 개체 목록입니다.

리플렉션을 사용하여 클래스에서 생성자를 가져 와서 인수 목록을 일치시키고 필요할 때 인스턴스를 작성합니다. 대부분의 경우, 생성자에 인수를 전혀 전달하지 않아도됩니다. 단점은 분명히 잘못된 인수 집합을 전달하는 경우 컴파일 타임에이를 감지 할 수 없기 때문에 런타임에 실패 할 경우 대화 상자가 표시된다는 것입니다. 그러나 정상적으로 실패하지는 않을 것이고 디버깅이 쉬운 경우 쉽게 디버깅 할 수 있습니다.

필자는 함수와 클래스 리터럴의 사용이 꽤 흔한 언어에서 왔기 때문에 이것이 훨씬 더 깨끗하다고 ​​생각합니다. 그러나 당신이 평범한 자바 프로그래머라면, 이것이 당신을 놀라게 할 것입니까, 아니면 엄청난 SelectionAdapters를 스캔하지 않아도 될까요?

+0

나는 반사와 함께 갈 것입니다. –

답변

3

일반적으로 반성은 눈살을 찌푸지 만 어떤 경우에는 매우 유용 할 수 있습니다. 수천 개의 작은 물건을 거치지 않고도 상당히 빨리 소화 할 수있는 코드를 읽으면 감사하겠습니다.

0

문제 자체가 반사되지 않습니다. 현대의 프레임 워크는 항상 반영을 사용합니다. 특수 효과를 사용하여 모든 일을 처리하는 것이 엉망입니다. 대개 반성이 필요합니다.

그러나 귀하의 경우에, 왜 당신은 그냥 해달라고 :

buildButton("button text", 
     new SelectionAdapterImplementation(new TaskForm(args))) 

익명 클래스 범위에서 최종 변수를 사용하지 않는 한, 나는 이유를 볼 수 없습니다.

+0

올바르게 이해한다면 익명 클래스를 사용하지 않는 것이 좋습니다.이 경우 인스턴스화하려는 모든 클래스에 대해 SelectionAdapter 구현을 작성해야합니다. 불행히도, 나는 수십개가있다. (TasksForm은 단지 하나의 예일 뿐이다.) 나에게 좀더 어수선하게 보이지만 어쩌면 나는 오해하고있다. – jsn

+0

네, 맞아. 리플렉션으로 이동하거나 대신 TaskForm 객체를 전달하십시오. – Artefacto

+0

그에 따라 게시물을 편집했습니다. – Artefacto

0

당신이 반영 할 수업을 듣기 위해 buildButton(String, SelectionAdapter)을 수정했습니다. 이제 수정 된 메소드에 새로운 SelectionAdapter을 작성한 다음 클래스 이름을 반영하여 인스턴스를 생성하고이를 showForm(arg)으로 전달한다는 것을 알았습니다. 나는 이것이 너가 갈 필요가있는 것보다 먼 단계라고 생각한다.

대신, showForm(arg)에 필요한 클래스를 인스턴스화 할 수 있습니다. 열쇠는 buildButton에 대한 귀하의 arglist에 final 그 arguement를 만드는 것입니다, 그리고 당신은 익명의 클래스에서 그것을 사용할 수 있습니다.

+1

양식은 사용자 인터페이스 구성 요소이므로 단추를 작성할 때 인스턴스를 구성 할 수 없으므로 단추를 클릭 할 때까지 기다려야하므로 SelectionAdapter – jsn

0

하나의 다른 방법은 양식을 만드는 단추를 반환하는 각 양식에서 정적 메서드를 사용하는 것입니다. 그러나 반성은 아마 더 나을 것입니다.

1

올바르게 이해하면 인수에 대해 다양한 종류의 버튼 구현 (양식)을 사용하여 한 번의 작업 (createButton)을 실행하려고합니다. 이것은 당신이 다형성을 필요로하는 것처럼 정확하게 들립니다.

반성에 대해 잊어 버리고 공통 인터페이스에서 이러한 양식을 구성하는 것이 좋습니다. 예 : interface Form { //some methods here }

모든 양식은 공통 인터페이스를 구현해야하며 이러한 방법은 버튼을 만드는 데 필요합니다. 당신이 양식 개체가있는 경우 모든 SelectionAdapter가 showForm 메소드를 호출입니다 않는 경우 그래서, 당신은 createButton(Form formObject){...}

에 전달할 수 있습니다, 당신은 일반적인 interface Form에 추가 단지 Form 객체에 대해이 메소드를 호출 할 수 있습니다. 따라서 많은 익명 클래스를 생성 할 필요가 없으며 하나만 "Form"객체로 인스턴스화 할 수 있습니다.

이렇게 모두 필요한 것은 다형성과 이러한 클래스에 대한 멋지게 선택한 인터페이스입니다.

Form 객체 (생성자가 다릅니다)를 만드는 데 큰 문제가있는 경우에는 구성 만 처리하는 MyFormBuilder를 만드는 것이 좋습니다. 빌더는 createInstance() 메소드 또는 모든 작업을 수행하는 getInstance() 메소드를가집니다.

내 제안에 따라 SelectionAdapter 클래스 구현이 1 개만 있으면 공통 인터페이스를 사용하여 개체를 전달할 것이므로 MyClass.class 인수를 전달하는 등 반사를 피할 수 있습니다.