Java 無傳統全局變量,所有數據歸屬於類。所謂「全局可訪問」實為 static 靜態成員:屬於類而非實例,全程單一拷貝,所有實例共享。常量定義核心在於 static final 組合——靜態確保單一存儲,final 保證不可變性。
public interface AppConstants {
int DEFAULT_PORT = 8080;
String SERVER_IP = "192.168.1.100";
boolean DEBUG_MODE = true;
}
// 使用:實現接口直接訪問
public class MyService implements AppConstants {
void connect() { System.out.println(SERVER_IP + ":" + DEFAULT_PORT); }
}
優點:語法簡潔,無需類前綴。
缺點:實現接口屬於實現細節洩露,污染類的公共 API;接口變質為工具類,違背接口定義契約的初衷。不推薦用於新項目。
public final class Constants {
// 私有構造器防止實例化
private Constants() {}
public static final int DEFAULT_PORT = 8080;
public static final String API_VERSION = "v2.1";
public static final double PI = 3.1415926535;
}
// 使用:類名.常量名
Constants.DEFAULT_PORT
優勢:語義清晰、防實例化、支持分組管理(巢狀類)、易於 IDE 重構、無副作用。首選方案。
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private int port;
private String dbUrl;
private Map featureFlags;
// getter/setter 省略
}
配合 application.yml:
app:
port: 8080
db-url: jdbc:mysql://localhost:3306/mydb
feature-flags:
new-ui: true
beta-api: false
核心價值:配置與代碼分離,支持多環境部署、熱更新、敏感信息加密、動態調整,無需重新編譯打包。
MAX_RETRY_COUNTDatabaseConstants、CacheConstants、SecurityConstantsCollections.unmodifiableList/Map 包裹public static final List LIST = new ArrayList<>(); — 列表引用不可變,但內容可變public static final List LIST = Collections.unmodifiableList(Arrays.asList("a", "b"));