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类,您的第三方数据库将调用func
notifyObservers

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();
    }
}