首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 接口引用賦值 null 完全合法:多態與解耦的基石

     編輯:程式設計綜合問答

代碼示例


public class AdapterWrapper implements ListAdapter {
    ListAdapter delegate = null; // 接口引用賦值 null
    // ...
}

結論:完全合法且極常見

接口引用可以賦值為 null,這是 Java 引用類型的基本特性,與類引用無異。

核心含義

  • ListAdapter delegate:聲明一個類型為 ListAdapter 的引用變量
  • = null:初始狀態不指向任何對象
  • 後續可指向任意實現了 ListAdapter 接口的類實例:

delegate = new SimpleCursorAdapter(...);     // 實現類 1
delegate = new ArrayAdapter<>(...);          // 實現類 2
delegate = new WrapperListAdapter(delegate); // 裝飾器模式
delegate = customAdapter;                    // 自定義實現

設計模式應用場景

模式接口引用作用null 初始化意義
策略模式持有策略接口,運行時切換算法默認無策略,需顯式設置
裝飾器模式包裝同接口對象,增強功能可選包裝對象
代理模式控制對真實對象的訪問延遲初始化真實對象
回調/監聽器定義回調契約無監聽器時為 null,調用前判空

最佳實踐:防禦性編程


// 調用前必須判空
if (delegate != null) {
    delegate.getView(position, convertView, parent);
}

// 或使用 Optional (Java 8+)
Optional.ofNullable(delegate).ifPresent(d -> d.getView(...));

// Kotlin 安全調用
delegate?.getView(position, convertView, parent)

常見誤區

  • ❌ 以為接口不能賦值 null → 接口是引用類型,完全可以
  • ❌ 以為 implements ListAdapter 的類實例化後才能賦值 → 引用變量聲明時即可賦值 null
  • ❌ 忽略判空導致 NPE → 習慣性 if (delegate != null) 或 ?.
  • ✅ 理解 接口引用 = 契約引用,null 代表「暫無實現」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved