錯誤代碼
public class LocalStorage {
Context ctx;
public LocalStorage(Context c) {
c = ctx; // 錯誤:將未初始化的 ctx 賦值給參數 c,導致 ctx 仍為 null
}
}
正確寫法
public class LocalStorage {
Context ctx;
public LocalStorage(Context c) {
ctx = c; // 正確:將傳入的 Context 賦值給成員變量
}
}
原理解析
- Java 參數傳遞是**值傳遞**(引用的值)。
c = ctx 意為「將成員變量 ctx(默認 null)的引用賦值給局部參數 c」,參數 c 變為 null,成員 ctx 不變。
ctx = c 意為「將參數 c 持有的引用賦值給成員變量 ctx」,成員 ctx 指向有效 Context。
最佳實踐
- 成員變量命名用
mContext 或 context,參數用 context,IDE 自動生成構造器可避免低級錯誤。
- 構造器中添加非空斷言:
this.ctx = Objects.requireNonNull(context, "Context must not be null");。
- 若類為單例或長期持有,使用
Application Context 避免內存洩漏:ctx = context.getApplicationContext();。