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

如何在Data2中访问Class1创建的Data对象实例(不新建对象)?

解决Android跨类访问已创建对象的问题

老哥,我来帮你搞定这个跨类访问对象的难题!你现在的困境是:在Class1里创建了Data实例,但Data2里直接引用时总是空指针,又不想用公共变量,对吧?先看看你的现有代码,再给你几个靠谱的解决方案。

你的现有代码

Data类(数据来源)

public class Data{ 
    private String mName; 
    public Data(String sometext){ 
        this.mName = sometext; 
    } 
    public String getmName(){ 
        return mName; 
    } 
}

Class1(主Fragment)

public class Class1 extends Fragment{ 
    private Data mData; 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInsatanceState){ 
        View view = inflater.inflate(R.layout.one, container, false); 
        mData = new Data("Someone Name");
        // ...其他业务代码
        return view;
    }
}

存在问题的Data2类

public class Data2{ 
    private Data notworking; 
    public Data2(){ 
        notworking.mName; // 空引用,无法正常访问
        notworking.getmName(); // 同样报空指针
    } 
}

问题根源

你在Data2里只声明了notworking这个Data类型变量,但它从来没有被赋值为Class1中已经创建好的mData实例,自然会是空引用。下面几种方法都不用把变量改成公共的,就能解决问题:


方法1:构造函数传递实例(最简单直接的方案)

直接在创建Data2的时候,把Class1里的mData实例通过构造函数传进去,这样Data2就能拿到现成的实例了。

修改后的Data2类:

public class Data2{
    private Data mData;

    // 通过构造函数接收已有的Data实例
    public Data2(Data existingData){
        this.mData = existingData;
        // 现在可以正常调用方法了
        String targetName = mData.getmName();
    }
}

在Class1中创建Data2时传入实例:

// 在Class1的onCreateView或其他合适位置
Data2 data2 = new Data2(mData);

方法2:接口回调传递(适合非直接创建场景)

如果Data2的创建时机和Class1不是直接绑定的,可以通过定义接口来传递实例,保证代码的解耦性。

步骤1:定义数据提供接口

public interface DataProvider {
    // 提供获取已创建Data实例的方法
    Data getCurrentData();
}

步骤2:让Class1实现该接口

public class Class1 extends Fragment implements DataProvider{
    private Data mData;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInsatanceState){
        View view = inflater.inflate(R.layout.one, container, false);
        mData = new Data("Someone Name");
        return view;
    }

    @Override
    public Data getCurrentData() {
        return mData;
    }
}

步骤3:在Data2中获取实例

public class Data2{
    private Data mData;

    public Data2(Context context){
        // 假设Class1是当前显示的Fragment,通过FragmentManager获取实例
        FragmentManager fm = ((AppCompatActivity)context).getSupportFragmentManager();
        Class1 class1Fragment = (Class1) fm.findFragmentById(R.id.your_fragment_container_id);
        
        if(class1Fragment != null){
            mData = class1Fragment.getCurrentData();
            String name = mData.getmName();
        }
    }
}

方法3:依赖注入(进阶方案,适合中大型项目)

如果你的项目规模较大,可以用Dagger、Hilt这类依赖注入框架,把Data实例限定在特定作用域(比如Fragment作用域),这样需要的地方都能拿到同一个实例,不用手动传递,代码更简洁易维护。不过这个方案对小项目来说可能有点“重”,按需选择就好。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:26:14