java基礎(chǔ)開發(fā)泛型類的詳解
前言
在軟件開發(fā)中,有許多執(zhí)行過程很類似,許多人使用復(fù)制粘貼完成功能,這種做法雖然編譯器不會報錯,但會使用波浪線給出提示,給以后的維護帶來了很大的隱患。這種情況開發(fā)人員通常根據(jù)需要成員抽取公用方法、公用類或使用繼承完成,提高了代碼的復(fù)用。但是,在一些特殊情況(如執(zhí)行過程中會使用到對象,這些對象操作相同,但具體的模塊有有所區(qū)別),此時只能使用泛型完成代碼的復(fù)用。
泛型概念
所謂泛型就是將類型由原來的具體類型參數(shù)化,類似于方法中的變量參數(shù),此時類型也定義成參數(shù)形式。這種參數(shù)類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。在實際的編程過程中,通過泛型可以定義類型安全的數(shù)據(jù)結(jié)構(gòu)(類型安全),而無須使用實際的數(shù)據(jù)類型(可擴展)。這能夠顯著提高性能并得到更高質(zhì)量的代碼(高性能),因為您可以重用數(shù)據(jù)處理算法,而無須復(fù)制類型特定的代碼(可重用)
泛型類
在ArrayList類中,ArrayList里面能夠放各種對象,如String、Integer、pojo等,可以完成他們的add()、get()等,聲明時在聲名構(gòu)造一個數(shù)組列表的時候用<>來說明這個容器里面放的是什么類型的東西,如ArrayList< String >代表是String集合,ArrayList就是一個泛型類,在這個類中,存放對象的類型是通過參數(shù)定義的,這個類就是泛型類。
由于一組操作的類型不同,我們不得不定義不同的函數(shù),這樣會產(chǎn)生大量基本相同的代碼。程序員已經(jīng)習(xí)慣了使用集合中的泛型類,實際上泛型更廣泛的應(yīng)用在業(yè)務(wù)邏輯的處理。泛型類中定義了一組操作,這組操作中完成相同過程。
【例】:在SSM模式下多個模塊controller需要完成分頁信息獲取、按照名稱模糊查詢及按照行政區(qū)劃碼等條件的查詢等功能。每個模塊的controller中的需要訪問的services對象不同,可以設(shè)計一個泛型類來編寫相應(yīng)代碼,避免出現(xiàn)大量的復(fù)制代碼。
public class TemplateController<T extends IBaseService,E> { private Logger logger = LoggerFactory.getLogger(getClass()); private T t; //調(diào)用時傳入T的對象 public TemplateController(T obj){ t=obj; } public R getList(Map<String, Object> params){ try { String pageSize = params.get("pagesize").toString(); String currPage = params.get("currpage").toString(); String cName = params.get("CName").toString(); String regionCode = params.get("regionCode").toString(); long size = Long.parseLong(pageSize); long currPageNo = Long.parseLong(currPage); Page<E> page=new Page<>(currPageNo,size); //查詢省市時代碼截斷 String code = RegionCode.GetRegionCode(regionCode); PageUtils data = t.getList(page,cName,code); return R.ok().put("data", data); } catch (Exception e) { logger.debug("傳入數(shù)據(jù)出錯"+e.getStackTrace()); return R.error("傳入數(shù)據(jù)出錯"+e.getMessage()); } } }
TemplateController<T extends IBaseService,E> 為泛型類,
定義了兩個類型參數(shù),分別為<T,E>其中T為有界類型,限定為實現(xiàn)了IBaseService接口的類。
IBaseService定義了getList方法,在完成數(shù)據(jù)提取操作中調(diào)用。
IBaseService代碼如下:
public interface IBaseService<T> { //取分頁記錄 PageUtils getList(Page<T> page, String cName, String regionCode); }
泛型的使用,ArtBankController繼承泛型類,將注入的對象傳入泛型類中,執(zhí)行代碼很簡單,
@RequestMapping("bank") public class ArtBankController extends TemplateController<ArtBankService,ArtBankEntity> { @Autowired private ArtBankService jobArtBankService; public ArtBankController(ArtBankService jobArtBankService) { super(jobArtBankService); } //執(zhí)行代碼簡單,只需調(diào)用父類的getList方法即可 @RequestMapping("/list") public R list(@RequestParam Map<String, Object> params){ return this.getList(params); } }
業(yè)務(wù)中很多模塊都需要分頁、按照名稱模糊查詢及按照行政區(qū)劃查詢時,實現(xiàn)了代碼的復(fù)用
結(jié)論
大家已經(jīng)很熟悉在集合類(map、list、set)中使用泛型,但是對于自身業(yè)務(wù)中的自定義的泛型類使用不多。在開發(fā)中只要圍繞著可擴展性、可維護性兩大主題,善于總結(jié),不難發(fā)現(xiàn)泛型類的使用場景
以上就是java基礎(chǔ)開發(fā)泛型類的詳解的詳細(xì)內(nèi)容,更多關(guān)于java基礎(chǔ)泛型類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解java WebSocket的實現(xiàn)以及Spring WebSocket
這篇文章主要介紹了詳解java WebSocket的實現(xiàn)以及Spring WebSocket ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01Java postgresql數(shù)組字段類型處理方法詳解
這篇文章主要介紹了Java postgresql數(shù)組字段類型處理方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10Java獲取XML節(jié)點總結(jié)之讀取XML文檔節(jié)點的方法
下面小編就為大家?guī)硪黄狫ava獲取XML節(jié)點總結(jié)之讀取XML文檔節(jié)點的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10詳解SSM框架下結(jié)合log4j、slf4j打印日志
本篇文章主要介紹了詳解SSM框架下結(jié)合log4j、slf4j打印日志,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11Maven一鍵部署Springboot到Docker倉庫為自動化做準(zhǔn)備(推薦)
這篇文章主要介紹了Maven一鍵部署Springboot到Docker倉庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的示例
這篇文章主要介紹了SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12