我有一个包含两个包的 OSGi bundle :
com.organization.api
此包已导出。com.organization.internal
此包未导出。
在com.organization.api
中,我有一个接口(interface)Foo
和类AsbtractFoo
package com.organization.api;
public abstract class AbstractFoo implements Foo {
private int state;
@Override
public int getState(){
return this.state;
}
}
在com.organization.internal
中,我有一个类FooManager
需要更改Foo的状态。如何在 com.organization.internal
之外的任何其他类无法更改 foo 的状态的条件下执行此操作。
package com.organization.internal;
public class FooManager {
private ???? foo = ....
public void updateFooState(){
foo.????();
}
}
我尝试添加具有默认访问权限的 setter (void setState(int state)
) 的 AbstractStatefullFoo
来打包 com.organization.internal
并让 AbstractFoo
扩展 AbstractStatefullFoo
但问题是,在这种情况下,其他 bundle 需要导出包 com.organization.internal
。
OSGi 中如何解决这样的问题?
最佳答案
我感觉您正在考虑将所有这些抽象类变得复杂。
最简单的情况是有一个带有 getState 的接口(interface) Foo。 然后你就可以在内部包中实现 Foo 了。
这种情况不需要其他包能够访问内部的 impl 类。关键是api包中还要有一个FooManager的接口(interface)。
然后,您创建实现 FooManager 的 FooManagerImpl 并将其导出为带有接口(interface)的服务。然后,其他包可以使用此服务来调用 updateState() 方法和其他操作 FooImpl 类的方法。
关于java - 方法访问和非导出包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44086086/