【问题标题】:Java code reuse through Inheritance when generics are involved (List in particular)?涉及泛型时通过继承重用Java代码(特别是List)?
【发布时间】:2010-07-14 08:38:04
【问题描述】:

除了如何“使用它们”之外,我对泛型知之甚少。在我的应用程序中,我有各种 ListView Activity,它们似乎共享相似的方法和变量,并且具有确切的“算法”,因为执行的步骤都非常相同。

例如,在我的 onCreate 方法中,我调用一个方法来添加页脚,启动一个进度对话框,调用一个基于 xml url 获取内容的方法,并且有一个 Handler 和 Runnable 字段用于调用该方法xml解析完成后为列表填充数据。

我在想也许我可以创建一个 BaseListActivity 来完成所有这些事情/对所有这些事情都有方法,并且每个特定的 ListActivity 都可以从中扩展。问题是他们使用 List 对象来保存 xml 解析的项目以及 ListAdapter 所支持的项目。

所以这里是使用的字段的代码:

// list of games from xml
private List<Game> mGames = new ArrayList<Game>();
private List<Game> mNewGames = null;

// Need handler for callbacks to the UI thread
private final Handler mHandler = new Handler();

// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
    public void run() {
        mGames.addAll(mNewGames);
        fillData();
    }
};

LayoutInflater mInflater = null;
private ProgressDialog mProgressDialog = null;
private int currentPage = 0;

所以真正的主要区别在于每个不同的活动将使用不同的对象类型作为列表(即游戏、媒体、文章等)。我该怎么做呢?

【问题讨论】:

    标签: java android generics inheritance oop


    【解决方案1】:

    我在想这样的事情:

    public abstract class BaseListActivity<T> extends ListViewActivity {
        private List<T> mItems; 
    
        protected abstract List<T> readAllFromXML();
        ...
    
    }
    

    参数 T 代表列表活动实现使用的实际类型。例如,派生类可能如下所示:

    public TexyListActivity extends BaseListActivity<String> {
        protected List<String> readAllFromXML() {
            ....
        }
        ...
    }
    

    readAllFromXML 方法留给子类实现,因为每个实现都为列表实例化不同的对象类型,因此它使用不同的逻辑从 XML 创建它们。

    【讨论】:

      【解决方案2】:

      适配器示例可以吗?

      public abstract class OnlineListAdapterTyped<T> extends BaseAdapter {
      
      private final ArrayList<T> items = new ArrayList<T>();
      
          @Override
          public final T getItem(int position) {
              return items.get(position);
          }
      
          protected abstract T deserialize(JSONObject obj) throws JSONException;
      }
      
      public class CategoriesAdapter extends
              OnlineListAdapterTyped<CatalogAppCategory> {
      
          @Override
          protected CatalogApp deserialize(JSONObject obj) throws JSONException {
          //
          }
      }
      

      【讨论】:

        【解决方案3】:

        定义一个模板化列表

        List<E> mObjItems = new ArrayList(); 
        

        并使用它来举办 Game、Media 或 Article 等课程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-25
          • 2014-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-09
          • 2011-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多