首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 泛型 DAO 兩種寫法對比與最佳實踐

     編輯:Java 相關知識

場景引入

在傳統分層架構中,DAO 層往往存在大量重複的 CRUD 代碼。引入泛型可以將通用邏輯抽象到基類,具體實體類僅需指定類型參數即可復用。本文對比兩種主流泛型 DAO 寫法並給出建議。

基礎實體類

public class User {
    private int id;
    private String name;
    // getter/setter 省略
}

寫法一:方法級泛型

在每個方法聲明前單獨聲明類型參數,適用於極少數方法需要不同類型參數的場景。

public class EntityDao1 {
    // 方法級泛型:返回值前聲明  或 
    public  void add(T t) { /* 保存邏輯 */ }

    public  T get(ID id) { /* 查詢邏輯 */ return null; }
}

特點:

  • 每次調用方法時才確定具體類型,靈活性最高。
  • 但無法在類層面約束實體類型與 ID 類型的對應關係,調用時需重複指定,易出錯。
  • 返回值為 void 時也需在 void 前加 <T>,語法略顯累贅。

寫法二:類級泛型(推薦)

在類聲明時定義類型參數,所有方法共享,構建類型安全的 DAO 基類。

public class EntityDao2 {
    public void add(T t) { /* 保存邏輯 */ }
    public T get(ID id) { /* 查詢邏輯 */ return null; }
}

優勢:

  • 類型安全:實例化時確定 T 和 ID,編譯期檢查所有方法簽名。
  • 代碼簡潔:方法無需重複聲明泛型參數。
  • 利於繼承:public class UserDao extends EntityDao2 即可獲得完整類型安全的 CRUD 能力。

實戰擴展:泛型 BaseDAO 模板

public abstract class BaseDao {
    private Class entityClass;

    public BaseDao() {
        // 通過反射獲取實際類型參數
        this.entityClass = (Class) ((ParameterizedType) getClass()
            .getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public void save(T entity) { /* 通用保存 */ }
    public T findById(ID id) { /* 通用查詢 */ }
    public void delete(T entity) { /* 通用刪除 */ }
    // 更多通用方法...
}

總結建議

維度方法級泛型類級泛型
適用場景工具類、靜態方法、極少數多態方法DAO、Service、Repository 等業務基類
類型安全弱(調用時指定)強(實例化時固定)
代碼復用低高(配合繼承)
推薦指數⭐⭐⭐⭐⭐⭐⭐

結論:DAO 層基類務必採用類級泛型,構建類型安全、可復用的數據訪問體系。方法級泛型保留給真正需要「每次調用類型不同」的工具方法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved