参考文档
http://www.cnblogs.com/panjun-Donet/archive/2008/09/27/1300609.html
泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。
可以查看下 Map, List , Future 等这些java 底层基础代码的写法,一目了然
下面举个我应用中碰到的例子以及写法,之所以举这个例子,主要是因为它包含了多种情况,1 参数是范型,2 返回值是范型,3,参数和返回值都是范型
app 产品中最不能缺的就是 push, 但是 ios 的推送 和 android 的推送还不一样,而且 android 推送还因为不同的第三方平台又不一样,比如小米推送,友盟推送,极光推送,百度云推送,个推推送等等
所以总思路是写一个通用接口,以及一个抽象类(主要是实现发送push),因为发送push的流程都是一样的,见下面的代码
接口
package com.zyguo.tools.push;public interfaceIPush{/**
* 异步发送PUSH*/
publicboolean sendPushByAsyn( PushBody pushBody );/**
* 同步发送PUSH
* @return 返回错误提示文案,若为 success, 说明发送成功*/
public String sendPushBySync( PushBody pushBody, intmaxWaitSec );
}
抽象类,因为不同的push通道,发送的消息格式是不一样的,而且返回值的格式也是不一样的(有json, xml ,byte 等等),所以定义了2个范型 M 代表消息,R代表返回值,privateString sendPush(PushBody pushBody) {} 就是发送push的通用流程
package com.zyguo.tools.push;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.apache.log4j.Logger;
import com.zyguo.sdk.thread.BLThreadPool;
import com.zyguo.sdk.utils.BUtils;public abstract class AbstractPushimplements IPush {protected Logger log = Logger.getLogger( this.getClass().getName() );public final static String SUCCESS = "success";private BLThreadPool threadPool = newBLThreadPool();privateString sendPush(PushBody pushBody) {try{if ( pushBody != null &&BUtils.isNotBlank( pushBody.getToken() ) ) {long begin =System.currentTimeMillis();
log.debug("begin send push:" +pushBody );
M msg=pushBody2message( pushBody );
R response=sendPush( msg, pushBody.getToken() );long end =System.currentTimeMillis();
log.debug("end push,result==" + response + ",耗时:" + ( end - begin ) + "毫秒");if ( response != null) {
String result=dealPushResponse( response, pushBody );
log.debug("send xiaomi push suceess," +pushBody );returnresult;
}else{
log.error("no_response," +pushBody);return "no_response";
}
}else{return "token is null";
}
}catch(Exception e) {
log.error("send xiaomi push exception", e);return "exception:" +e.getMessage();
}
}protected abstractString dealPushResponse( R response, PushBody pushBody );protected abstractM pushBody2message( PushBody pushBody );protected abstractR sendPush( M msg, String token );
@Overridepublicboolean sendPushByAsyn( final PushBody pushBody) {
threadPool.submit(newRunnable() {public voidrun() {
sendPush( pushBody );
}
});return true;
}
@Overridepublic String sendPushBySync( final PushBody pushBody, intmaxWaitSec ) {
Future future = threadPool.submit( new Callable() {publicString call() throws Exception {returnsendPush( pushBody );
}
});try{
String result= future.get( maxWaitSec, TimeUnit.SECONDS );returnresult;
}catch(InterruptedException e) {
e.printStackTrace();
}catch(ExecutionException e) {
e.printStackTrace();
}catch(TimeoutException e) {
e.printStackTrace();
}return null;
}public voidsetThreadPool(BLThreadPool threadPool) {this.threadPool =threadPool;
}
}
小米 push 如下, 具体实现就不写出了
package com.zyguo.tools.push;
import java.io.IOException;
import org.json.simple.parser.ParseException;
import com.xiaomi.push.sdk.ErrorCode;
import com.xiaomi.xmpush.server.Constants;
import com.xiaomi.xmpush.server.Message;
import com.xiaomi.xmpush.server.Message.Builder;
import com.xiaomi.xmpush.server.Result;
import com.xiaomi.xmpush.server.Sender;public class XiaoMiPush extends AbstractPush{privateString appKey;privateString packageName;
@OverrideprotectedMessage pushBody2message( PushBody pushBody ){returnnull;
}@OverrideprotectedString dealPushResponse( Result response, PushBody pushBody ) {returnSUCCESS;}
@OverrideprotectedResult sendPush(Message msg, String token) {return null;
}public voidsetAppKey(String appKey) {this.appKey =appKey;
}public voidsetPackageName(String packageName) {this.packageName =packageName;
}
}
iOS push 如下
package com.zyguo.tools.push;
import com.xiaomi.push.sdk.ErrorCode;
import com.xiaomi.xmpush.server.Constants;
import com.xiaomi.xmpush.server.Message;
import com.xiaomi.xmpush.server.Result;
import com.xiaomi.xmpush.server.Sender;
import com.zyguo.sdk.utils.BUtils;public class IOSPush extends AbstractPush{@OverrideprotectedString dealPushResponse(Object response, PushBody pushBody) {return null;
}
@OverrideprotectedPayload pushBody2message(PushBody pushBody) {return null;
}
@Overrideprotectedboolean sendPush(Payload msg, String token) {return null;
}}