2014-01-22 86 views
0

我不太確定Java註釋,但我認爲它們可以解決我的問題。強制一個類實現兩個實現另一個接口的接口之一

我有一個java接口「目標」。這是一個空的界面,所以我可以將這個實現放到一個「TargetHolder」中,它只是一個目標列表。

現在我只有2種類型的目標。鍵入「Alpha」並鍵入「Beta」。

類型「Alpha」與類型「Beta」沒有共同的功能。

最簡單的方法就是從「目標」中擴展「Beta」和「Alpha」。但是通過這個解決方案,程序員可以創建一個只擴展「目標」的類,這是不可能的。

  1. 我可以通過註釋解決嗎?
  2. 如何?

回答

1

理論上,您可能能夠使用註釋處理器實現檢查(在編譯時)。問題是,如果javac在源文件中找到正確類型的註釋,它將只在源文件上運行註釋處理器。

「掃描在命令行上的源文件和類以確定哪些註釋的存在之後,編譯器將查詢處理器,以確定哪些註解它們處理。當發現匹配時,所述處理器將被調用。 「

器(javac手動)

但好像你想要一個接口上的註解來約束實現接口的所有類。這意味着要檢查所有這些類......但是我看不到如何在沒有相關注釋的類上觸發註釋處理器的運行。

這使得你有幾個選項:

  • 落實檢查爲(比如說)PMD規則。
  • 編寫一個工具在運行時查找相關接口,檢索它們的註釋,然後拖拽實現註釋接口的所有類。

我的建議是把這個納入「太硬」籃筐。這可能需要更多的時間來實現這一點,而不是在早期提取相關編碼錯誤時節省的時間。 (我在想,當你試圖避免的情況下,會在有人嘗試使用類時被拿起,所以,你(或你的客戶)應該在測試中發現你的(他們)不正確的類...)

0

怎麼樣?

  1. 爲此工作創建一個包。讓我們稱之爲目標。
  2. 將Target.java放入包目標 - 包私有。
  3. Put Alpha。java在包目標中 - public
  4. 將Beta.java放入包目標中 - 公開
  5. 編譯,jar和封裝包目標。
0

使用工具如JArchitect可以執行設計規則。 在你的情況你可以使用下面的cqlinq查詢:

warnif count > 0 from t in Types where t.Implement ("Target") 
&& (!t.Implement("Alpha")|| !t.Implement("Beta")) 
select t 
相關問題