我有这个抽象类myapi.MyAbstract
,它由客户端包扩展。
package myclientbundle;
import myapi.MyAbstract;
public class MyClass extends MyAbstract {
// Implementation
}
我需要在myapi.MyAbstract
添加一个非API方法,但我找不到这样做的方法。该方法只能从我的API包中调用。
我最接近解决方案的方法是将方法default
放在内部界面中,然后更改myapi.MyAbstract
以实现MyInternalInterface
。因此,MyClass将继承该方法,并且无法从API包外部调用它。但它并不能阻止在客户端捆绑包中被覆盖。
还有另一种方法吗?
答案 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)。