2012-05-24 95 views
1

我有一個類(Capsule),它有很多方法(30+)被保護。這個想法是允許開發者擴展這個類並在類中使用受保護的方法(ImADev),但是讓開發者公開它們(覆蓋方法,因爲他們認爲合適)。Java:簡單的方法來公開受保護的方法

我現在有一個使用案例,我想對這些對象傳遞到幾個實用工具類/方法,並允許他們訪問受保護的方法..除非他們是受保護的,所以我的實用工具類/服務能夠」不要看他們。

請參見下面的例子:

// My Capsule class with protected methods 
public abstract class Capsule { 
    public Capsule(..) { .. } 
    protected String getFoo() { return "foo"; } 
} 

// How a dev should use the class 
public class ImADev extends Capsule { 
    public ImADev(..) { super(..); } 
    public String getBar() { this.getFoo() + "BAR"); 
} 

// A special utility class 
// Helper.helper() can accept any class derived from Capsule 
public class Helper { 
    public String helper(Capsule c) { 
     return " im doing something awesome with " + c.getFoo(); 
     // Except i cant do this, because c.getFoo() is protected. 
    } 
} 

什麼是解決這個問題的最好方法?請記住,我有很多受保護的方法。

+0

移動工具類生活在同一個包。 –

回答

1

沒有辦法,「圍繞」這一點,除了把實用類在同一個包與保護方法的類。如果這些課程不止一個包,那也無濟於事。

在決定使用受保護的,你做出了決定,現在你被卡住的影響。您可以忍受它,更改爲公開或更改包成員身份以利用默認訪問權限。

2

無論你的類是做太多,在這種情況下,把它分解成更小的更明確定義的類

或者實現你的實用類可以調用來包裝你保護的方法

還是安全的公共方法,只是讓它們公開,因爲它聽起來像他們可能/應該是

或者,將類中的數據與行爲(組合)分開,那麼你的工具類只需要處理更安全的公共getter方法而不是保護行爲方法可以改變內部

有點難以提供更好的答案,而不知道更多關於您的應用程序,它的使用

1

我看到至少有兩個選項。

  1. 讓助手膠囊的子類。或者,
  2. 將受保護的方法轉換爲默認的輔助功能,並將Helper類放入與Capsule類相同的包中。

編輯:您還可以或許完成正是你想要與反思的東西。

+0

受保護意味着包可見性,因此不需要將其更改爲默認值2。 –

1

其實,有一個方法來調用從包或子類以外的保護方法:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/reflect/AccessibleObject.html

我只是在開玩笑!這個工具存在技術性的東西,如持久性的序列化。

將方法聲明爲「受保護」只是一種組織代碼並定義哪部分應該處理哪些數據的方法,因此嘗試「繞」不是一個好主意,除非您錯誤地聲明它受保護。在這種情況下糾正第一個錯誤。

如果你有興趣在如何組織高效和清晰的方式你的代碼,我強烈建議閱讀http://java.sun.com/docs/books/effective/