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

Java跨包訪問對象實例:靜態容器模式最佳實踐

     編輯:程式設計綜合問答

問題場景

包a中有Class A及實例a1、a2。包b中Class B需訪問這兩個具體實例,要求:不創建新實例、A非單例。

解決方案:靜態容器類

// 包 a 中新增
package a;

public class GlobalRegistry {
    public static A a1;
    public static A a2;
    
    // 可選:初始化方法
    public static void init(A instance1, A instance2) {
        a1 = instance1;
        a2 = instance2;
    }
}

// 包 a 原有代碼修改
package a;
public class A {
    // ... 原有代碼
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new A();
        GlobalRegistry.init(a1, a2); // 註冊實例
    }
}

// 包 b 中訪問
package b;
import a.GlobalRegistry;

public class B {
    public void useA() {
        A instance1 = GlobalRegistry.a1; // 直接獲取
        A instance2 = GlobalRegistry.a2;
        // 使用 instance1, instance2...
    }
}

設計模式對比

模式優點缺點適用場景
靜態容器簡單直接、無依賴框架全局狀態、難測試小項目、舊代碼改造
依賴注入解耦、可測試、生命周期管理需框架支持Spring/Guice項目
觀察者模式事件驅動、鬆耦合複雜度高多模塊響應
Service Locator集中管理、延遲初始化隱藏依賴插件化架構

Spring項目中的最佳實踐

@Component
public class AService {
    // Spring管理單例Bean
}

// 另一模塊注入使用
@Autowired
private AService aService; // 自動獲取同一實例

核心原則

  1. 共享引用而非複製對象:傳遞對象引用地址
  2. 明確所有權:誰創建誰負責生命周期
  3. 避免循環依賴:包a不應依賴包b
  4. 考慮線程安全:多線程環境用ConcurrentHashMap或AtomicReference

「靜態容器」是理解依賴注入本質的橋梁:集中存儲、按需獲取、統一生命周期。

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