防止在另一个bundle中调用/覆盖方法

时间:2017-03-14 16:48:12

标签: java osgi

我有这个抽象类myapi.MyAbstract,它由客户端包扩展。

package myclientbundle;

import myapi.MyAbstract;

public class MyClass extends MyAbstract {
    // Implementation
}

我需要在myapi.MyAbstract添加一个非API方法,但我找不到这样做的方法。该方法只能从我的API包中调用。

我最接近解决方案的方法是将方法default放在内部界面中,然后更改myapi.MyAbstract以实现MyInternalInterface。因此,MyClass将继承该方法,并且无法从API包外部调用它。但它并不能阻止在客户端捆绑包中被覆盖。

还有另一种方法吗?

2 个答案:

答案 0 :(得分:0)

修改

我理解MyAbstract和MyClass在不同的包中。 (如果它们位于同一个程序包中,请检查here以获取程序包专用访问级别。)

您定义方法的界面至少需要具有受保护的可见性,否则另一个包中的类MyClass无法读取它。

接口上的方法根据定义是公共的,不能是最终的。因此,接口上的默认方法对所有类都可见,并且可以覆盖。

你可以这样做:

public abstract class MyAbstract {
    protected final void foo() {}
}

public class MyClass extends MyAbstract {
}

MyAbstract延伸的所有类都可以看到foo方法,但该方法不能再被覆盖,因为它已标记为final

答案 1 :(得分:0)

如果您的界面采用不同的范围方法,您应该问自己是否违反了单一责任原则。例如,如果需要从其他地方访问它们,您可以创建2个API接口(不同的包或捆绑包)。

但是,如果它仅用于内部使用,您可以在实现包/未导出包中创建第二个更具体的接口。

例如:MyAbstract(API)< --- MySpecificAbstract(接口,但在IMPL中)< ------- MyClass(IMPL)。