2014-05-01 73 views
1

我有兩個類:StudentUserUser類擴展了Student,並且它們都實現了一個公共接口,該接口定義了checkSelf()方法。此方法檢查對象的狀態是否有效,並在執行數據庫中的更新或插入操作之前被調用。Checkstyle:方法不適用於擴展,但它需要是

我在數據庫中插入了學生和用戶,這使得在這兩種情況下都可以從課堂外調用此方法。這就是爲什麼在this post找到了解決辦法似乎並不適用於我的問題。也許我錯過了一些東西。

基本上,事情的方式現在,無論是checkSelf()方法是公衆和一個在User類調​​用從做自己的檢查之前,它的父(Student)之一。

我怎麼能解決這個問題,所以我有乾淨的代碼?

+0

你在這兩種情況下都可以從課堂外召喚什麼? –

+0

基本上說,這個方法必須是公開的,因爲它會被另一個類調用。 – PLPeeters

回答

4

我個人不同意這個規則(恕我直言,比使用更令人頭疼),但是你提到的問題中的答案給出了你可以做什麼的相當好的指示。

  • 充分利用checkSelf()方法最終
  • 創建Student空保護checkSelfEx()方法被稱爲的checkSelf()
  • 最後一步實現用戶checkSelfEx()使其決賽。

這可保證在調用方法時始終執行checkSelf()執行的檢查(因此不會因子類而導致合同中斷)。當然,問題出現在命名上,就好像你想在用戶的一個子類中使用更多的邏輯,你需要checkSelfExEx()。如果所有這些檢查都可以用更好的名字進行分組,那麼至少可以閱讀,但是將很多最終方法暴露給子類並不是一件好事。

+0

終於明白了,謝謝你的洞察。 – PLPeeters

+0

如果我想讓繼承更深入,我該怎麼辦?例如'class A {}','class B extends A','class C extends B'等等? – RoninDev

+1

@RoninDev這個規則應該與淺類層次結構中使用。 Checkstyle自己說:「創建的類沒有錯,這個檢查只適用於圖書館項目,而不是應用程序項目」。因此,它僅適用於您在API中公開提供的類,並且這些類不太可能具有深層次結構(我們不計算可以從其子類中繼承的私有類,而只包括其他公共類)。恕我直言,既然你控制的建立,它可能是更好的只是做一個自定義的註釋,並建立檢查,以確保超級實現調用。 – Ordous

相關問題