对于java的多态特性,只要是做java的,大家就算没用过,也绝对听过,因为这是java的基本特性。java的多态特性,既然存在,就有其价值。
举个真实的例子:
作为一名Android开发,有时候会遇到这样的产品需求,如下
都是列表形式展现,下面是列表的展现形式,格式都一样,只是接口请求的数据不同,展现形式相同。
作为一个Android开发,如果是最简单的做法:
列如:请求api1获得List<Order> api2获得List<Express>
对每个list分别写一个适配器,代码就不写了,很简单,但是代码冗余,明明是一个的格式,只是因为接口字段不同,只是因为不同的bean,导致需要写2个适配器,这是多么痛苦的事情。
我们可以在简化一下,上述代码太冗余,使用泛型去适配不同的bean类,代码如下
Order.Class
public class Order {
private String name;
public Order(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Express.Class
public class Express {
private String name;
public String getName() {
return name;
}
public Express(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
}
ListAdapter.Class
public class ListAdapter<T> extends BaseAdapter {
List<T> list;
public ListAdapter(Context context, List<T> list) {
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//do something
T t = list.get(position);
if (t instanceof Express) {
// TODO: 2017/7/26 显示订单
} else if (t instanceof Order) {
// TODO: 2017/7/26 显示运费
}
//do something
return convertView;
}
}
但是这种方式我们还要通过判断类型去适配,试问有没有连类型都不用判断的方法,直接显示,获取就显示,这样该多方便啊!然而 我们的确有这种方法可以处理,那就需要运用到java的多态特性。代码如下:
首先新建一个接口
public interface ICommon {
String getCommonName();
void setCommonName(String name);
}
还是之前的Order.Class 和 Express.Class ,不同之前在于,现在这2个类都要实现上面的ICommon接口并做一些处理:public class Express implements ICommon {
private String name;
public String getName() {
return name;
}
public Express(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String getCommonName() {//注意这里,重写的方法里面加入本类的get方法
return getName();
}
@Override
public void setCommonName(String name) {
setName(name);
}
}
public class Order implements ICommon{
private String name;
public Order(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String getCommonName() {
return getName();
}
@Override
public void setCommonName(String name) {
setName(name);
}
}
最精彩的就是在适配器里面:
public class ListAdapter extends BaseAdapter {
List<ICommon> list;
public ListAdapter(Context context, List<ICommon> list) {
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//do something
ICommon iCommon = list.get(position);
//name指代订单名称或者快递名称
name.setText(iCommon.getCommonName());//运用多态的特性,获取到实现的子类的属性值
//do something
return convertView;
}
}
最后调用适配器的时候: //运费列表是适配
Express express = new Express("快递");
List<Express> expressesList = new ArrayList<>();
expressesList.add(express);
expressesList.add(express);
expressesList.add(express);
expressesList.add(express);
expressesList.add(express);
ListAdapter listAdapter = new ListAdapter(this, expressesList);
listView.setAdapter(listAdapter);
//订单列表的适配
Order order= new Order("订单");
List<Order> orderList = new ArrayList<>();
orderList.add(order);
orderList.add(order);
orderList.add(order);
orderList.add(order);
orderList.add(order);
ListAdapter listAdapter = new ListAdapter(this, orderList);
listView.setAdapter(listAdapter);
大功告成,如此一来我们不用为了一些相同的布局但是不同的 数据结构而造成的麻烦而被困扰,或者浪费时间。
好的代码都是一遍遍提炼出来的,巧妙运用的话 ,真的会使代码更上一个层次,对于自己也是一次新的超越!