使用 Java 传递具有动态属性的 Parceled 对象的值时使用 indexOf 的技术?
Technique for using indexOf when working with Java pass by Value for Parceled Object with dynamic properties?
当特定对象的所有属性都在动态变化(即不保证创建后相同)时,可以实现什么样的技术才能使用默认的 ArrayList indexOf
假设我有一个名为 DataManager 的 class,它跟踪静态 ArrayList 中的 Car 对象。
public class DataManager {
public static ArrayList<Car> carList = new ArrayList<>();
}
在Activity1中,我在carList中添加了一个Car Object,然后将Car打包发送给Activity2使用。
public Activity1 extends Activity {
protected void onCreate(....) {
Car originalCar = new Car("Red","0");
DataManager manager = new DataManager();
manager.carList.add(originalCar);
Intent i = new Intent(Activity1.this, Activity2.class);
i.putExtra("parcelledCar",originalCar);
startActivity(i);
}
因为Java在Activity2中接收car对象时按值传递,创建了一个新的对象,hashCode不会和原来的对象一样,防止Java.Object .equals() 正确比较。
public Activity2 {
protected void onCreate(....) {
Car parcelledCar = intent.getParcelableExtra("parcelledCar");
DataManager manager = new DataManager();
manager.carList.indexOf(parcelledCar); // RETURNs -1
// because the (.equals inherited from Java.Object compares
// addresses which are not the same)
}
}
我意识到在这种情况下覆盖默认的 .equals() 可能会有所帮助,但我不确定如果不能保证 Car 对象的所有属性在整个应用程序生命周期中保持不变,如何比较对象循环。
例如:
public class Car {
private String colour;
// Different cars can have the same colour
private int timesDriven;
// Value is dynamic and subject to change throughout application
}
在数据库中使用类似 GUID 的东西会很好,但在我的特定用例中 我没有使用数据库 而且我不知道有任何内置 android 用于创建类似标识符的 GUID 的实用程序,该标识符在对象的分块实例中保持不变(如果有意义的话)?
Activity2收到的Car
对象与原来的Car
对象不是同一个实例与Java路过无关-价值。这是由 Android 完成的 serialization/parcel 造成的。 Java 按值传递会将 reference 按值传递给对象,但它将是 same 对象实例。
如果 Car
对象总是首先在 DataManager
中创建,那么您可以向 Car
对象添加一个 id
字段,并使用赋值AtomicInteger
由 DataManager
维护。然后,您将 List
替换为 id
到 Car
对象的 Map
。
现在您可以在活动之间发送 id
,然后查找 Car
对象。
基本上,您已经将 DataManager
变成了一个简单的内存数据库。
当特定对象的所有属性都在动态变化(即不保证创建后相同)时,可以实现什么样的技术才能使用默认的 ArrayList indexOf
假设我有一个名为 DataManager 的 class,它跟踪静态 ArrayList 中的 Car 对象。
public class DataManager {
public static ArrayList<Car> carList = new ArrayList<>();
}
在Activity1中,我在carList中添加了一个Car Object,然后将Car打包发送给Activity2使用。
public Activity1 extends Activity {
protected void onCreate(....) {
Car originalCar = new Car("Red","0");
DataManager manager = new DataManager();
manager.carList.add(originalCar);
Intent i = new Intent(Activity1.this, Activity2.class);
i.putExtra("parcelledCar",originalCar);
startActivity(i);
}
因为Java在Activity2中接收car对象时按值传递,创建了一个新的对象,hashCode不会和原来的对象一样,防止Java.Object .equals() 正确比较。
public Activity2 {
protected void onCreate(....) {
Car parcelledCar = intent.getParcelableExtra("parcelledCar");
DataManager manager = new DataManager();
manager.carList.indexOf(parcelledCar); // RETURNs -1
// because the (.equals inherited from Java.Object compares
// addresses which are not the same)
}
}
我意识到在这种情况下覆盖默认的 .equals() 可能会有所帮助,但我不确定如果不能保证 Car 对象的所有属性在整个应用程序生命周期中保持不变,如何比较对象循环。
例如:
public class Car {
private String colour;
// Different cars can have the same colour
private int timesDriven;
// Value is dynamic and subject to change throughout application
}
在数据库中使用类似 GUID 的东西会很好,但在我的特定用例中 我没有使用数据库 而且我不知道有任何内置 android 用于创建类似标识符的 GUID 的实用程序,该标识符在对象的分块实例中保持不变(如果有意义的话)?
Activity2收到的Car
对象与原来的Car
对象不是同一个实例与Java路过无关-价值。这是由 Android 完成的 serialization/parcel 造成的。 Java 按值传递会将 reference 按值传递给对象,但它将是 same 对象实例。
如果 Car
对象总是首先在 DataManager
中创建,那么您可以向 Car
对象添加一个 id
字段,并使用赋值AtomicInteger
由 DataManager
维护。然后,您将 List
替换为 id
到 Car
对象的 Map
。
现在您可以在活动之间发送 id
,然后查找 Car
对象。
基本上,您已经将 DataManager
变成了一个简单的内存数据库。