Java 当不可能隐藏构造函数时,是否使用类似于单例的模式?
我知道单身模式 我需要实现两个类实例之间的双向通信,但实例化不是由我完成的(而是由某些第三方库完成的) 此第三方库还要求公共默认构造函数必须以以下形式提供:Java 当不可能隐藏构造函数时,是否使用类似于单例的模式?,java,android,singleton,Java,Android,Singleton,我知道单身模式 我需要实现两个类实例之间的双向通信,但实例化不是由我完成的(而是由某些第三方库完成的) 此第三方库还要求公共默认构造函数必须以以下形式提供: public MyClassA(Context ctx); 此第三方库将初始化我的两个类MyClassA和MyClassB 在它们之间进行通信(调用彼此的函数)最有效/推荐的技术是什么 因此,第三方库使用上面显示的构造函数实例化了MyClassA。它还实例化了MyClassB(其签名与MyClassA非常相同) 然后,在该第三方发生某些事
public MyClassA(Context ctx);
此第三方库将初始化我的两个类MyClassA
和MyClassB
在它们之间进行通信(调用彼此的函数)最有效/推荐的技术是什么
因此,第三方库使用上面显示的构造函数实例化了MyClassA
。它还实例化了MyClassB
(其签名与MyClassA
非常相同)
然后,在该第三方发生某些事件时(调用名为
onEvent0
的MyClassA
实现方法),我需要调用MyClassB
实例的doSomeAction
函数:
3rdpartylib::notify -> myclassa::onEvent0() -> myclassb::doSomeAction
我知道,当第三方实例化我的类时,我可以存储一个实例,但如果我们考虑到Android平台,它有一些很好的
处理程序,以及ServiceConnection
范例,这是推荐的方法吗?您可以使用Observer设计模式来解决这个问题。正如您的问题明确指出的那样,您需要通过第三方数据库的通知来调用myClassA中的某些函数
创建一个subject类,您的第三方数据库将调用funcnotifyObservers
public class ThirdPartyLibSubject {
private List<ThirdPartyLibObserver> observers = new ArrayList<>();
public void register(ThirdPartyLibObserver observer){
observers.add(observer);
}
public void unregister(ThirdPartyLibObserver observer){
observers.remove(observer);
}
public void notifyObservers(){
observers.forEach(ThirdPartyLibObserver::update);
}
}
“然后,当这个第三方(调用MyClassA的实现方法onEvent0)发生一些事件时,我需要调用MyClassB实例的doSomeAction函数”——为什么?为什么MyClassB
不能保存其他对象,而您的MyClassA
对象可以调用它doSomeAction()
?例如,MyClassB
(也许还有MyClassA
)可以是围绕其他执行实际工作的对象的薄包装,其中这些其他对象通过依赖项反转框架(Dagger/Hilt、Koin-in-Kotlin等)获得。在连接这些其他对象时,您将具有更大的灵活性。
public interface ThirdPartyLibObserver {
void update();
}
public class ObserverClassA implements ThirdPartyLibObserver{
@Override
public void update() {
MyClassA.getInstance().onEvent0();
}
}