限制Java中方法调用的访问

时间:2017-08-02 06:17:21

标签: java design-patterns

我上课A。此类包含两个方法,例如method1()method2()。现在我还有另外两个名为BC的类。两个类都将包含A类的相同实例。

现在,我希望以我的'B class can only call method1()and my other C'类可以调用method2()的方式限制访问。设计方案如下 -

class A {
    void method1(){/*-------------*/}
    void method2(){/*-------------*/}
}

现在,如果我创建A的实例并与我的BC类共享

class B {
    A ob;
    public B(A ob) {
        this.ob=ob;
    }
    public void process() {
        ob.method1(); //only call method1()
        ob.method2(); //can't access it.
    }
}

class C {
    A ob;
    public C(A ob) {
        this.ob=ob;
    }
    public void process() {
        ob.method2(); //only call method2()
        ob.method1(); //can't access it.
    }
}

5 个答案:

答案 0 :(得分:3)

简单:你做不到。

与C ++中的“friend”概念相比,您只能更改所有其他类的可见性。

换句话说:在Java中,您遇到了受保护,受保护,私有和公开的问题。没有“私人为B”和“公开为C”。

当然,你可以做一些非常奇怪的事情,比如一个方法分析它自己的堆栈跟踪,如果它发现被“错误”调用则抛出异常类。但这样做很可能是不好的做法。

从这个意义上说,真正的答案是:退后一步,仔细看看这两种方法背后的功能。如果你真的认为这些功能需要不同的可见性 - 那么他们可能首先不应该在相同的类中!因为他们可能实现了两个非常不同的职责 - 而且,任何阶级,方法......都应该只有一个责任。

你可以得到的最接近的是smosel的建议:你的类实现了不同的接口,并确保客户端通过“接口”接口使用你的类 - 然后它们在他们可以调用的方法中受到限制。但是当然 - 客户端可以轻松接口引用转换为类引用,然后调用其他方法。

鉴于评论:单独使用的名称表示上述要点:当A是 ConfigurationLoader 时 - 为什么它包含检查的方法>一个配置? ConfigurationLoader 加载配置(由C类触发) - 该操作的结果将是“配置”对象 - 然后B类将使用该配置对象(而不是与 loader 交互)。

答案 1 :(得分:3)

一种解决方案是将每个方法移动到自己的接口中,并start_session(); $_SESSION['user_id'] = $login; header("Location: index.php"); exit(); 实现两个接口:

A

现在,您可以将同一个对象interface A1 { void method1(); } interface A2 { void method2(); } class A implements A1, A2 { @Override public void method1() {} @Override public void method2() {} } 传递给A1,将B传递给A2。您可以将其投放到C以访问任一方法(取决于A的可见性),但这不太可能发生错误。

答案 2 :(得分:0)

您应该根据https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

中指定的java访问级别规则来安排您的类层次结构

根据您的需求,您可以将method1method2放入不同的类别,例如A1A2。然后,A1将与B位于同一个包中,A2将与C位于同一个包中。应该使用no modifier定义类。

答案 3 :(得分:0)

您可以使用2个适配器类,并在a和b中使用不同的类。 对我来说似乎有点矫枉过正。 另一种认为你可以做的是创建方法3,它调用方法1或2并决定它在实例化时调用哪一个。

答案 4 :(得分:0)

从技术上讲,有几种方法可以执行此操作,例如将方法声明为private,然后使用反射仅调用允许执行此操作的类中的相应方法。然而,这种设计与Java原则形成对比,使用它通常不是一个好主意。最好的办法是重新设计方法,以达到理想的效果。