Parcelable или Singleton?

Я работаю над проектом, в рамках которого мне приходится делиться списком объектов массива со всеми действиями, составляющими приложение. До недавнего времени я передавал список между действиями путем реализации интерфейса parcelable. Пример этого виден ниже:

Класс MenuItem:

ublic class MenuItem implements Parcelable {

private String name;
private double price;
private int qty;
private String info;

public MenuItem(String name, double price) {
    super();
    this.name = name;
    this.price = price;
}
public MenuItem() {
    // TODO Auto-generated constructor stub
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public double getPrice() {
    return price;
}
public void setPrice(double price) {
    this.price = price;
}

public int getQty() {
    return qty;
}
public void setQty(int qty) {
    this.qty = qty;
}
public String getInfo() {
    return info;
}
public void setInfo(String info) {
    this.info = info;
}
@Override
public String toString() {
    return name;
}


//Parcelable methods.
public static final Parcelable.Creator<MenuItem> CREATOR = new Parcelable.Creator<MenuItem>() {

    @Override
    public MenuItem createFromParcel(Parcel source) {
        return new MenuItem(source);
    }

    @Override
    public MenuItem[] newArray(int size) {
        return new MenuItem[size];
    }
};

public MenuItem(Parcel source) {
    this();
    readFromParcel(source);
}

private void readFromParcel(Parcel source) {
    name = source.readString();
    price = source.readDouble();
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(name);
    dest.writeDouble(price);
}

}

Класс заказа - который я бы изменил на Singleton (содержит список пунктов меню)

public class Order implements Parcelable {


private int covers;
private int table;
private ArrayList<MenuItem> items;


public Order(){
    super();
    this.items = new ArrayList<MenuItem>();

}

public static final Parcelable.Creator<Order> CREATOR = new Parcelable.Creator<Order>() {

    @Override
    public Order createFromParcel(Parcel source) {
        return new Order(source);
    }

    @Override
    public Order[] newArray(int size) {
        return new Order[size];
    }


};

public Order(int covers, int table) {
    super();
    this.covers = covers;
    this.table = table;
    this.items = new ArrayList<MenuItem>();
}

public int getCovers() {
    return covers;
}

public void setCovers(int covers) {
    this.covers = covers;
}

public int getTable() {
    return table;
}

public void setTable(int table) {
    this.table = table;
}

public ArrayList<MenuItem> getItems() {
    return items;
}

public void setItems(ArrayList<MenuItem> items) {
    this.items = items;
}

//add to order
public void addToOrder(MenuItem m){
    items.add(m);
}

//remove from order
public void removeFromOrder(MenuItem m){
    items.remove(m);
}

public Order(Parcel source) {
    this();
    readFromParcel(source);
}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    dest.writeInt(covers);
    dest.writeInt(table);
    dest.writeTypedList(items);

}

private  void readFromParcel(Parcel source) {
    // TODO Auto-generated method stub
    covers = source.readInt();
    table = source.readInt();
    items = new ArrayList<MenuItem>();
    source.readTypedList(items,  MenuItem.CREATOR);

}

}

Вот как я передаю данные между действиями:

myOrderBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "myOrderBtn", Toast.LENGTH_SHORT).show();
            Intent i = new Intent(v.getContext(), ViewOrderActivity.class);
            i.putExtra("data", order);
            if(!saved){
            saveOrderState();
            }
            startActivity(i);

        }
    });

и получить таким образом:

public void getOrderData(){
    Intent i = getIntent();
    if(i != null && i.hasExtra("data")){
        order = i.getParcelableExtra("data");
        Toast.makeText(this.getApplicationContext(), "STARTERS recieved order object, covers: " + order.getCovers() + " table no: " + order.getTable() + " order size: " + order.getItems().size(), Toast.LENGTH_SHORT).show();

        if(order.getItems().size() == 0){
            //Toast.makeText(this.getApplicationContext(), "No items added to your order...", Toast.LENGTH_SHORT).show();
        }else{
            for(int j = 0; j != order.getItems().size(); j++){
                dishItems.add(order.getItems().get(j));
            }
        }

        saved = false;

    }
}

Сегодня я узнал об использовании Singleton для глобального доступа к данным, и мне интересно, будет ли хорошей идеей перейти на этот стиль доступа к данным? Кажется, легче контролировать и намного аккуратнее с уважением к коду.

Мне было бы интересно узнать ваше мнение по этому поводу. Эта ссылка здесь - шаблон, который я хотел бы реализовать:

http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

Я должен отметить, что проект является частью моей учебы в моем курсе. Я должен отправить свой код через несколько недель, поэтому я ищу лучший способ сделать его более эффективным. Поэтому, пожалуйста, дайте мне знать, если вы видите что-то, что выглядит неправильно!

1 ответ

Решение

Существует очень мало причин использовать Parcelable для перемещения объекта внутри одного процесса Linux. Я предлагаю сделать ваше меню статическим членом пользовательского объекта Application, примерно так:

public class MyApplication extends Application {
    private static final List<MenuItem> menu;
    static {
        List<MenuItem> l = new ArrayList<MenuItems>();
        l.add(new MenuItem(...));
        ...
        menu = Collections.unmodifiableList(l);
    }

    ...

    public List<MenuItems> getMenu() { return menu; }

    ....

}

Убедитесь, что список неизменен, чтобы вам не приходилось беспокоиться о проблемах параллелизма.

В вашем манифесте:

<application
    android:name=".MyApplication"

... и получить к нему доступ с помощью:

List<MenuItem> menu = ((MyApplication) getApplication()).getMenu();
Другие вопросы по тегам