You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让两个对象共享访问同一对象的数据?类实例数据重置问题

嘿,这个问题其实是开发里很常见的对象状态共享场景,我给你整理几个实用的解决方案,都是日常项目里常用的:

方案1:单例模式(Singleton)

如果你希望整个应用里只有一个B类实例,不管哪个类调用都是同一个,那单例模式最适合。核心思路是让B类自己控制实例的创建,对外只提供一个获取实例的入口,禁止外部直接new。

举个Java的例子(其他语言思路类似):

public class B {
    // 私有静态实例,保存唯一的B对象
    private static B instance;

    // 私有构造方法,防止外部通过new创建新实例
    private B() {}

    // 公共方法,返回唯一的实例
    public static B getInstance() {
        // 懒加载:第一次调用才创建实例
        if (instance == null) {
            instance = new B();
        }
        return instance;
    }

    // 你的业务变量和方法
    public int sharedValue;
    public void updateData(int value) {
        this.sharedValue = value;
    }
}

之后不管是类A还是其他类,都通过B.getInstance()获取实例:

// 类A里的调用
public class A {
    public void setBData() {
        B b = B.getInstance();
        b.updateData(100); // 设置共享数据
    }
}

// 另一个类C里的调用
public class C {
    public void readBData() {
        B b = B.getInstance();
        System.out.println(b.sharedValue); // 输出100,和A设置的一致
    }
}

⚠️ 注意:如果是多线程环境,上面的懒加载写法会有线程安全问题,建议用枚举单例或者加同步锁的方式实现。

方案2:依赖注入(Dependency Injection)

如果你的场景不需要全局唯一的B实例,只是想让特定的几个类共享同一个B对象,那依赖注入是更灵活的选择。核心思路是:先提前创建好一个B实例,然后把这个实例传递给需要它的类(比如A和另一个类),而不是让这些类自己去new B。

例子如下:

// 类A:通过构造方法接收B实例
public class A {
    private B bInstance;

    public A(B b) {
        this.bInstance = b;
    }

    public void modifyBData() {
        bInstance.sharedValue = 200;
    }
}

// 另一个类C:同样接收同一个B实例
public class C {
    private B bInstance;

    public C(B b) {
        this.bInstance = b;
    }

    public void printBData() {
        System.out.println(bInstance.sharedValue); // 输出200
    }
}

// 调用入口
public class Main {
    public static void main(String[] args) {
        // 先创建一个共享的B实例
        B sharedB = new B();
        
        // 把同一个sharedB传给A和C
        A a = new A(sharedB);
        C c = new C(sharedB);
        
        a.modifyBData();
        c.printBData(); // 共享数据生效
    }
}

这种方式的好处是非常灵活:如果需要另一组类共享另一个B实例,只要新建一个B对象注入即可,不会像单例那样全局唯一。而且符合面向对象的依赖倒置原则,代码耦合度更低。

方案3:静态变量(不推荐,仅适用于简单场景)

如果只是想共享某个具体的数据,而不是整个B对象的状态,可以把B里的变量设为静态的。静态变量属于类本身,所有实例共享同一个值:

public class B {
    // 静态变量,所有B实例共享
    public static int sharedValue;

    public void doSomething() {
        // 业务逻辑
    }
}

之后不管类A还是其他类,不管new多少个B实例,访问B.sharedValue都是同一个值。但这种方式的缺点很明显:静态变量是全局状态,容易导致代码难以维护和调试,不符合对象封装的思想,所以除非是非常简单的场景,否则不推荐使用。


内容的提问来源于stack exchange,提问作者asdfs99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:15:19