传递在活动之间扩展抽象类的对象

时间:2013-04-18 10:12:50

标签: java android oop android-intent android-activity

我试图通过为我玩的棋盘游戏制作帮助程序来学习Android开发。我遇到的情况与Pass custom object between activities中回答的情况非常相似。我的情况不同,有问题的自定义对象都是扩展抽象类。

抽象类代表一个芯片(与智能卡游戏相媲美),如下:

import java.util.ArrayList;

public abstract class Chip{
    protected String name;
    protected int imageID;
    protected ArrayList<String> chipColors;
    protected ArrayList<String> chipTypes;

    public String toString(){
        return name;    
    }

    //Getters
    public String getName(){ return name; }
    public int getImageID() { return imageID; }
    public String getSet() { return set; }
    //Figure out how I need to deal with colors/types when I get there
}

扩展Chip的类的一个例子:

public class ChipA extends Chip{
    public ChipA (){
        super();
        name = "Chip A";
        imageID = R.drawable.chipa;
        set = "Basic";
        chipTypes = new ArrayList<String>();
        chipTypes.add("typeA");
        chipColors = new ArrayList<String>();
        chipColors.add("red");
        chipColors.add("green");
    }
}

我采用这种方法,这样我就可以通过调用我需要的new ChipA()来创建相应类型的新芯片,而不是new Chip(<long list of arguments that describe Chip A>)。我需要将这些芯片的集合从一个活动传递到另一个活动。我已经在我的代码中通过存储我想要传递的Chips来解决这个问题,如this article中所述,但文章的结尾建议使用intent extras来代替这种操作。有人可以更清楚地解释原因吗?这只是惯例吗?如果只是一个可读性问题,这种方法似乎相对紧凑和可读。

从阅读中可以清楚地看出,使用Intent附加功能在活动之间传递任意类的预期方法是让它们实现Parcelable。但是,由于我正在使用该类的许多子类,这意味着向每个子类添加writeToParcelParcelable.Creator。 (describeContents()似乎并不重要,据我所知,我可以在基本的抽象类中实现它。)我可能会在这里有很多子类,这意味着添加了大量的重复代码。在这种情况下,实施Parcelable仍被视为首选方法吗?我错过了一些可以减少冗余代码的东西吗?如果可能的话,我宁愿保持我的芯片子类相当紧凑。

请保持温和,我是Stack Overflow和Android开发的新手。

1 个答案:

答案 0 :(得分:2)

你没有遗漏任何东西,Parcelable是这样做的首选方式 我同意它会导致一些样板代码,但这是处理这个问题的干净方法。

可以通过扩展Application类来跳过这一步但是会导致一些复杂的问题:在某些情况下可以删除Application对象,这会导致非常麻烦的错误。以预期的方式处理此方法更容易,并为您正在移动的每个对象创建构造函数(Parcel)。

另一点是,单身人士模式本身受到越来越多的批评。我不会详细介绍,这些讨论涵盖了这个主题:
https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
 What is so bad about singletons?

更糟糕的是,在Android中,你甚至不能指望真正的单身人士;您没有任何保险,您正在操作的应用程序对象(或您自己创建的Singleton)将在应用程序的生命周期内保持其状态。 (随机参考:http://portabledroid.wordpress.com/2012/05/04/singletons-in-android/

所以请不要使用Singleton作为避免编写几个Parcel的方法。它会在以后再回来咬你。

编辑:这里有一个很好的解释如何重现可怕的Application类崩溃:http://www.developerphil.com/dont-store-data-in-the-application-object/