| 維度 | 靜態工具類 | 單例模式 |
|---|---|---|
| 內存洩漏風險 | 無(不持有引用) | 高(若持有 Context/Activity 引用) |
| 生命周期 | 類加載即存在,進程結束釋放 | 需手動控制,易忘釋放 |
| 線程安全 | 無狀態方法天然安全 | 需雙重檢查鎖/靜態內部類實現 |
| 可測試性 | 難 Mock(PowerMock 可解) | 易替換實現(接口+依賴注入) |
| 擴展性 | 僅靜態方法,無繼承多態 | 可實現接口,支持多態替換 |
public final class StringUtils {
private StringUtils() {} // 防實例化
public static boolean isEmpty(String s) { return s == null || s.trim().isEmpty(); }
public static String maskPhone(String phone) { ... }
}
public class AppConfig {
private static volatile AppConfig instance;
private final Context appContext;
private AppConfig(Context context) { this.appContext = context.getApplicationContext(); }
public static AppConfig getInstance(Context context) {
if (instance == null) synchronized (AppConfig.class) {
if (instance == null) instance = new AppConfig(context);
}
return instance;
}
// 持有 Application Context,安全無洩漏
}
Android 中無狀態工具方法首選 static;有狀態/需生命周期管理才考慮單例,且**只持有 Application Context**。