java - 来自单例的两个对象

标签 java android

我想从下面的类中创建两个对象,并存储两个数组列表,事实上我想在单例中存储相同类型的两个变体

我称之为

CrimeLab.get(getActivity()).getCrimes();

在不同的 Activity 中但由于引用同一对象(数组列表)而遇到问题

 public class CrimeLab {
    private static final String TAG = "CrimeLab";
    private static final String FILENAME = "crimes.json";

    private ArrayList<Crime> mCrimes;
    private CriminalIntentJSONSerializer mSerializer;

    private static CrimeLab sCrimeLab;
    private Context mAppContext;

    private CrimeLab(Context appContext) {
        mAppContext = appContext;
        mSerializer = new CriminalIntentJSONSerializer(mAppContext, FILENAME);

        try {
            mCrimes = mSerializer.loadCrimes();
        } catch (Exception e) {
            mCrimes = new ArrayList<Crime>();
        }
    }

    public static CrimeLab get(Context c) {
        if (sCrimeLab == null) {
            sCrimeLab = new CrimeLab(c.getApplicationContext());
        }
        return sCrimeLab;
    }

    public Crime getCrime(int id) {
        for (Crime c : mCrimes) {
            if (c.getId() == (id))
                return c;
        }
        return null;
    }

    public void addCrime(Crime c) {
        mCrimes.add(c);
        saveCrimes();
    }

    public ArrayList<Crime> getCrimes() {
        return mCrimes;
    }

    public void deleteCrime(Crime c) {
        mCrimes.remove(c);
        saveCrimes();
    }

    public boolean saveCrimes() {
        try {
            mSerializer.saveCrimes(mCrimes);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

提前谢谢您

最佳答案

问题来自于使用静态变量 sCrimeLab。当您将其他 getActivity() 传递给 CrimeLab.get 时,您正在更新(更改)第一个对象。因为你没有解释为什么你需要这样做,我建议将方法主体更改为:

public static CrimeLab get(Context c) {
    return new CrimeLab(c.getApplicationContext());
}

或者,如果必须保持原样,请更改获取此类的方式:

CrimeLab crimeLab = new CrimeLab(getActivity());
crimeLab.getCrimes();

关于java - 来自单例的两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875091/

相关文章:

Java 科学数据处理

java - fax4j : cannot send fax 的意外结果

java - 上下文在Fragment中返回null

android - 如何将 android 应用程序限制为特定设备品牌?

android - Android 上的图表引擎

java - 使用错误的用户名/密码在 Java 中建立 DB2 连接时出现问题

java - 基于 Vert.x 的应用程序在 docker 容器上崩溃

java - Kotlin 注释不在 fieldDecleration 或编译的 java 中

android - 如何在java代码中为按钮设置圆角半径?

java - 直接在 Android 适配器中更改日期格式