如何限制java接口在多个类中实现

时间:2012-09-13 05:34:54

标签: java interface

我需要开发只能实现一次的界面。如果其他类尝试在同一个项目中实现相同的接口,则不应该允许它或给出错误。

interface A {
   void someMethod();
}

class B implements A {
    void someMethod() {
        // implementation here
    }
}

现在我想限制其他类来实现接口A

class c implements A { //this  should not allowed in this project
}

是否有可能开发这种界面?任何人都可以建议,我怎样才能实现这一目标?

5 个答案:

答案 0 :(得分:3)

简单回答,如果你的界面是公共/包受保护的,那就不可能了。

答案 1 :(得分:2)

这违背了界面的目的。如果你只有一个实现,它也可能是具体的。

接口意味着由多个类实现。这允许您切换实现,而不必担心其实现细节。例如,接口最常见的用途是使用集合框架,尤其是ListSetMap

// Hides the implementation details of ArrayList within a List variable
List<String> strs = new ArrayList<String>();
// Hides the implementation details of LinkedList within the same List variable
strs = new LinkedList<String>();
// All code using strs is agnostic to what kind of list it is (mostly)
strs.add("Hello, Dolly");
System.out.println(strs.get(0));

接口主要体现两个OOP概念:encapsulationpolymorphism。如果您不打算使用界面来完成这两件事之一,请不要使用界面。只需使用具体(非抽象)类。此时使用界面是过度的。

我能想到的唯一例外是当你想要使用Java的Proxy类时。只有这样才能接受1:1的接口:类比率,因为你必须有一个接口来将实现包装在Proxy实例中。

答案 2 :(得分:1)

听起来您的设计是错误的,并且您的界面实际上应该只是class B的一部分。

接口的意义在于它允许同一组方法的不同实现,您在此尝试避免这些方法。

答案 3 :(得分:0)

interface Aclass B放在同一个套餐中。

所有不应该实现A的类都应该在这个包之外。

答案 4 :(得分:0)

了解A实施的唯一全球方式是,如果他们向您注册,这是毫无意义的,您可以忘记这一点。

我不确定您是否要求与您合作的A的所有实例都有Object.class之外的公共类,或者他们的类是相同的,或者他们的类是{{ 1}}。

无论您要强制执行什么,您都需要针对B.class的实例测试不合适的情况,但是您与A的实例无法合作反正。

或者,对于您传递的A的每个实例,您可以创建一个新的A并从传递的B中插入所需的数据。

但首先,你应该考虑为什么你想要这个,当有A的不同实现时,它可能不是真正的问题。