2011-01-22 79 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与此同时。

相关问题