2010-05-15 30 views
5

這可能是一個相當主觀的問題,但可能不是。 我的應用程序包含一些在不同時間向用戶顯示的窗體。每種形式都是自己的一類。通常,用戶單擊一個按鈕,該按鈕將啓動一個新表單。Java反射適當性

我有一個建立這些按鈕的方便的功能,你這樣稱呼它:

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

我這樣做幾十次,這真的很麻煩不必每次都要做出SelectionAdapter。

真的所有我需要的按鈕知道的是,當它被點擊,哪些參數給構造函數來實例化什麼課,所以我建立了我這樣調用的函數:

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

凡ARGS是可以用來正常實例化TasksForm的對象的任意列表。

它使用反射從類中獲取構造函數,匹配參數列表,並在需要時創建實例。大多數情況下,我不必將任何參數傳遞給構造函數。不利的一面是,如果我傳遞了一組錯誤的參數,它在編譯時無法檢測到,所以如果失敗,會在運行時顯示一個對話框。但它通常不會失敗,如果它確實很容易調試。

我認爲這更清潔,因爲我來自使用函數和類文字的語言很常見。但是如果你是一個普通的Java程序員,會看到你這個怪胎,或者你會感激不必掃描一個zillion SelectionAdapters?

+0

我會用反射去。 – 2010-05-15 19:33:51

回答

3

是的,通常反射是皺眉,但在某些情況下,它可能是非常有用的。我會很感激閱讀代碼,我可以很快消化,而無需通過一個億的小東西。

0

問題本身並不是反映。現代框架始終使用反思。使用註釋來做各種事情是很時髦的,這通常需要反思。

然而,在你的情況,你爲什麼不只是做:

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

,除非你的匿名類是使用從範圍最終變量,我看不出有任何理由。

+0

如果我正確理解你,你建議不要使用匿名類,在這種情況下,我必須爲每個想實例化的類構建一個SelectionAdapter的實現。不幸的是,我有幾十個人(TasksForm只是一個例子)。似乎對我更加混亂,但也許我是誤解。 – jsn 2010-05-15 18:59:47

+0

好吧,你是對的。然後轉而使用反射,或者改爲傳遞TaskForm對象。 – Artefacto 2010-05-15 19:07:25

+0

我已編輯相應的帖子。 – Artefacto 2010-05-15 19:11:32

0

您已修改您的buildButton(String, SelectionAdapter)以參加您將反思的課程。我收集你現在正在修改的方法中創建一個新的SelectionAdapter,然後反思類名,創建一個實例並將其傳入showForm(arg)。我認爲這比你需要走的更遠。

相反,你可以讓它需要你的showForm(arg)要求的任何類的實例。關鍵是要在您的arglist中爲buildButton進行final爭論,並且您將能夠在您的匿名課程中使用它。

+1

因爲窗體是一個用戶界面組件,所以當我構建按鈕時,我不能實例化它,我必須等到按鈕被單擊,因此SelectionAdapter – jsn 2010-05-15 19:43:55

0

另一種方法是在每個表單中都有一個靜態方法,該方法返回一個創建表單的按鈕。但反思可能會更好。

1

如果我理解正確,你想要爲不同類型的按鈕實現(形式)執行一個操作(createButton)作爲參數。這聽起來就像你需要多態性。

我建議你忘了反思,並在一個共同的接口構建這些形式。 比方說 interface Form { //some methods here }

所有的表單都必須實現通用接口,並且這些方法是創建按鈕所必需的。所以,如果你有一個表單對象,你可以將它傳遞給createButton(Form formObject){...}

如果所有SelectionAdapter確實是調用showForm方法,你可以把它添加到普通interface Form,只是援引Form對象這個方法。因此,您不需要創建許多匿名類,只需創建一個類並使用「Form」對象進行實例化即可。

因此,所有你需要的是多態,併爲這些類很好的選擇界面。

如果您在創建Form對象時存在很大的問題(它們的構造函數不同),可能應該考慮創建一個僅處理構造的MyFormBuilder。建設者將有createInstance()方法或getInstance()方法,這將做所有的工作。

我的建議你將有1個SelectionAdapter類的實現,你將傳遞具有通用接口的對象,並且會避免反射,傳遞MyClass.class參數等等。