Parcelable ed eredità in Android
-
27-09-2019 - |
Domanda
ho ottenuto un'implementazione di Parcelable di lavoro per una singola classe che coinvolge alcuna eredità. Ho problemi capire il modo migliore per implementare l'interfaccia quando è venuto a eredità. Diciamo che ho ottenuto questo:
public abstract class A {
private int a;
protected A(int a) { this.a = a; }
}
public class B extends A {
private int b;
public B(int a, int b) { super(a); this.b = b; }
}
La domanda è, che è il metodo consigliato per implementare l'interfaccia Parcelable per la B (in A? In ciascuno di essi? Come?)
Soluzione
Ecco la mia soluzione migliore, sarei felice di sentire da qualcuno che ha avuto un pensiero su di esso.
public abstract class A implements Parcelable {
private int a;
protected A(int a) {
this.a = a;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(a);
}
protected A(Parcel in) {
a = in.readInt();
}
}
public class B extends A {
private int b;
public B(int a, int b) {
super(a);
this.b = b;
}
public static final Parcelable.Creator<B> CREATOR = new Parcelable.Creator<B>() {
public B createFromParcel(Parcel in) {
return new B(in);
}
public B[] newArray(int size) {
return new B[size];
}
};
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(b);
}
private B(Parcel in) {
super(in);
b = in.readInt();
}
}
Altri suggerimenti
Questa è la mia variante. Penso che sia bello perché mostra la simmetria tra i metodi di lettura che rivalutazioni virtuali in modo molto chiaro.
Nota a margine:. Penso che Google ha fatto un lavoro davvero poveri a progettare l'interfaccia Parcelable
public abstract class A implements Parcelable {
private int a;
protected A(int a) {
this.a = a;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(a);
}
public void readFromParcel(Parcel in) {
a = in.readInt();
}
}
public class B extends A {
private int b;
public B(int a, int b) {
super(a);
this.b = b;
}
public static final Parcelable.Creator<B> CREATOR = new Parcelable.Creator<B>() {
public B createFromParcel(Parcel in) {
B b = new B();
b(in);
return b;
}
public B[] newArray(int size) {
return new B[size];
}
};
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(b);
}
public void readFromParcel(Parcel in) {
super(in);
b = in.readInt();
}
}
Questa è l'implementazione per la classe A in un ambiente mondo reale dal momento che la classe B probabilmente avrà più di un oggetto con diversi tipi diversi int
Si utilizza la reflection per ottenere i tipi. quindi utilizza una funzione di ordinamento per ordinare i campi in modo che la lettura e la scrittura avvengono nello stesso ordine.