2011-01-22 83 views
1

我有方法設置爲public,因爲它們必須由外部類調用,但我只想讓它們通過一個或兩個方法調用。被其他方法調用可能會在我的程序中產生錯誤。因此,爲了阻止我在我自己的方法避免發生意外編程,我一直在做這樣的東西,而我想限制呼叫者的方法中:Java - 通過什麼方法可以被稱爲

if(trace.length<2){ 
    throw new Exception("Class should not call its own function."); 
}else if(trace[1].getClassName()!=desiredClassName || trace[1].getMethodName()!=desiredMethodName){ 
    throw new Exception(trace[1].getClassName()+"\" is invalid function caller. Should only be called by "+desiredClassName+"->"+desiredMethodName+"."); 
} 

有別的我應該做的,或者我應該忘記我的程序是如何工作的嗎?

+0

寫javadocs? – BalusC 2011-01-22 05:59:18

+0

聽起來好像我應該開始這樣做,但是我仍然在想,如果有人像我描述的那樣編程來明確地阻止不正確的呼叫,或者如果有人發現這些散佈在我的代碼中,我會只是笑了起來。 – schnozzinkobenstein 2011-01-22 06:08:10

回答

4

您應該使用的可視性,以限制呼叫 - 製作方法公開(或就此而言,javadocing它)是行不通的,除非你有dicipline(和你控制主叫太)。從你的描述來看,你既不是。

你可以做的是使類包私人,並把它放在同一個包中該類的兩個電話。只要你有一個合適的包裝結構,這可以工作。例如: - 你的類,它只能由A和B被稱爲:

package thepackage.of.a.and.b; 
//imports here 
class CallableByAB { 
public void methodA(){} 
public void methodB(){} 
} 

答:

package thepackage.of.a.and.b; 
public class A { 
    /*...other code here */ 
    new CallableByAB().methodA(); 
    /*...other code here */ 
} 

B:

package thepackage.of.a.and.b; 
public class B { 
    /*...other code here */ 
    new CallableByAB().methodB(); 
    /*...other code here */ 
} 

其它類不能調用new CallableByAB()或導入。因此,安全。使用訪問規則

3

這看起來像一個非常脆弱的解決方案,你不應該需要解決的問題。

在這種特殊情況下,你可能不會在將來的維護吃虧太大,只是一對夫婦的這些類型的特別警衛的方法。但想象一下,試圖將這樣的邏輯應用於大型代碼庫中的許多方法 - 這不是一件可行的事情。即使在你的情況下,你也可以編寫不能在其他上下文中重用的代碼。

事實上,你需要這樣做肯定反映了某種錯誤的設計。

我推斷你有某種有狀態的接口,如果意外調用它的狀態會被弄髒。理想情況下,我希望使界面更健壯,但如果這不能完成:如果有特定方法應該使用此界面,那麼可以將這些方法移動到特定類 - 也許是當前objtec的內部類 - 並且只能在這個類中看到句柄?

private Class TheLegalCaller { 
     private RestrictedCallee myCallee = new RestricatedCallee() ; // or other creation 
     public void doOneThing() { myCallee.doOne(); } 
     public void doOtherThing() } myCallee.doOther(); } 
} 

現在有了這個缺點是,它只是推動問題上升了一個層次,如果你隨機使用TheLegalCaller在錯誤的地方,然後我猜你仍然有一個問題。但是,也許通過使限制非常明顯,它有助於你的記憶?

0

我發現了一個很簡單的方法來做到這一點,但需要一些編碼方法:

class AllowedCaller { 
    private Object key; 
    public boolean getKey(){ 
    return key; 
    } 
    public void allowedCallingMethod(RestrictedAccessClass rac){ 
    this.key = rac; 
    rac.restrictedMethod(); 
    this.key = null; 
    } 
} 

class RestrictedAccessClass{ 
    public void restrictedMethod(){ 
    if(allowedCallerInstance.getKey() != this){ 
     throw new NullPointerException("forbidden!"); 
    } 
    // do restricted stuff 
    } 
} 

,我認爲還可以提高,以防止restrictedMethod多線程同時訪問()。
此外,密鑰可能位於AllowedCaller之外的另一個類中(因此RestrictedAccessClass不需要了解AllowedClass),並且此類控制可以是集中式的,因此可以使用多個對象鍵(而不是單個鍵)的ArrayList與此同時。

相關問題