所以我有一个未定义的对象,我想用另一个具有相同值的未定义对象从数组列表中删除它,这样我就可以有一个类来处理我抛出的每个对象,而不必为每个对象类型创建不同的方法。
问题是,尽管对象的内容是相同的,但由于它是另一个示例,所以总体值是不同的。
比如:
味精。trademsg@1d97b82
味精。trademsg@1a3337fb
即使这两个对象具有相同的值,它们也是不同的,并且不会用.equals返回true
所以我的问题是,当一个对象有相同的字段,但我不知道对象类是什么时,如何从数组列表中删除它?
还是有更简单的方法?
代码:
//valueToDelete can be of any type like User, Items, Trade...
public void deleteFromJson(Object valueToDelete, String fileLocation) throws IOException {
Gson gson = new Gson();
ArrayList<Object> oldValues = new ArrayList<>();
//If valueTiDelete is null, the whole content of the file will be deleted
if (valueToDelete != null) {
//Get Content out of array and add it to the ArrayList
for (Object oldValue : updateOldValues(fileLocation)) {
oldValues.add(gson.fromJson(oldValue.toString(), valueToDelete.getClass()));
}
//This does not work, because the objects are 2 different instances but still have all the same fields.
//How can I remove an object from the array list, when it has the same fields but I don't know what the Object class is?
oldValues.remove(valueToDelete);
}
// Write updated content in file
Writer writer = new FileWriter(fileLocation);
gson.toJson(oldValues, writer);
writer.flush();
writer.close();
}
1条答案
按热度按时间cvxl0en21#
要验证两个对象(属于未知类和可变类)所包含的值是否相等,可以
覆盖两者
Object::equals
以及Object::hashCode
在所有可能进入该列表的类中,或者使用反射探测对象内部并深入检查是否相等
第二种方法很难做到,如果不小心的话,很容易出错。例如,hibernate这样做是为了完成它的脏检查功能,所以我不会说这是一个不好的实践,但肯定会停留在灰色区域。
旁注:有这样的需求通常意味着需要重新设计模型