簡體   English   中英

Java:公開受保護方法的簡便方法

[英]Java: Easy way to make protected methods public

我有一個類(膠囊),其中有很多受保護的方法(超過30種)。 這個想法是允許開發人員擴展該類並在該類(ImADev)中使用受保護的方法,但要讓開發人員將它們公開給公眾(按他們認為合適的方法覆蓋)。

現在,我有一個用例,我想將這些對象傳遞給一些實用程序類/方法,並允許它們訪問受保護的方法..除了它們是受保護的之外,因此我的實用程序類/服務無法看到它們。

請參閱以下示例:

// 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.
    } 
}

最好的辦法是什么? 請記住,我有很多受保護的方法。

您的課程做得太多,在這種情況下,將其分解為更小,定義更明確的課程

或者,實現實用程序類可以調用的安全公共方法來包裝受保護的方法

或者,只是將它們公開,因為聽起來好像他們可能/應該

或者,將類中的數據與行為(組成)分開,那么您的實用工具類僅需要處理更安全的公共獲取方法,而無需處理可以更改內部結構的受保護行為方法。

在不了解您的應用程序及其使用情況的情況下,很難提供更好的答案

除了將實用程序類與具有受保護方法的類放在同一包中之外,沒有其他方法可以解決。 如果這些類包含在多個軟件包中,那將無濟於事。

在決定使用protected時,您已經做出了決定,而現在您被困在其中了。 您可以使用它,更改為公共名稱或更改包成員身份以利用默認訪問權限。

我至少看到兩個選擇。

  1. 將Helper設為Capsule的子類。 要么,
  2. 將您的受保護方法轉換為默認可訪問性,然后將Helper類與Capsule類放在同一包中。

編輯:您也可以通過反射完全完成您想要的操作。

實際上,有一種方法可以從包或子類外部調用受保護的方法: http : //docs.oracle.com/javase/1.5.0/docs/api/java/lang/reflect/AccessibleObject.html

我只是在開玩笑! 該工具用於持久化序列化之類的技術工作。

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

如果您對如何高效,清晰地組織代碼感興趣,我強烈建議您閱讀http://java.sun.com/docs/books/effective/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM