簡體   English   中英

JAVA - 是否可以在多個地方注入的非靜態 class 中有實例變量?

[英]JAVA - Is it possible to have Instance variable in a non-static class which is injected at multiple places?

我的服務中有一個非最終實例變量。 (我使用了一個實例變量,因為它在單個方法流中的不同情況下填充,我不想通過將其設為局部變量來一次又一次地填充它,因為它使用數據庫調用來獲取值)。

現在,這個服務是在我的構造函數中使用private final關鍵字注入的。 我觀察到此變量將其值存儲在隨后的 API 調用中。

這是因為服務是使用final關鍵字注入的嗎?

  1. 解決辦法是什么? 使用private關鍵字只能解決問題嗎?
  2. 為什么在注入依賴項時完全使用final
  3. 如果僅使用 private 關鍵字無法解決此問題,我應該如何在單個流中使用的方法之間重用此變量(不可變)? 由於它是按值傳遞的,因此在父方法中將其初始化為 null 然后在每個實例中檢查它都不起作用。 一種解決方案是創建一個 singleton 列表,但有更好的解決方案嗎?

代碼構造器:

@Slf4j
@Component
@RequiredArgsConstructor
public class Constructor {

    private final Service service;

    public List<Restriction> checkRestrictions(A a, B b) {
        return service.checkRestriction(a, b);
    }

服務:

@Slf4j
@Service
@RequiredArgsConstructor
public class Service {

    private TeamResponseDto originalDetails = null;

    public List<restriction> checkRestriction(A a, B b){
        Restriction r1 = method1();
        Restriction r2 = method2();
        List<Restriction> list = new ArrayList();
        list.add(r1);list.add(r2);
        return list;
    }
    private Restriction method1(){
        if(something){
        return new Restriction();
        }
        originalDetails = dbCall();
        return new Restriction(originalDetails);
    }
    private Restriction method2(){
        originalDetails = originalDetails == null ? DBCall() : originalDetails;
        return new Restriction(originalDetails);
    }
}

為了避免method2中的DB Call,我寫了上面的結構。 第一次,它工作正常。 第二次,即通過新的 API 調用的新線程,originalDetails 仍然反映它第一次從 DB 獲取的內容。

在您的Service中有 state 是非常糟糕的主意。 一個簡單的解決方案是將originalDetails作為參數傳遞,並在 1 個方法調用的 scope 中保留 object 的 state 而不是 scope 寬:object

public class Service {

    public List<Restriction> checkRestriction(A a, B b){
        TeamResponseDto originalDetails = DBCall();
        Restriction r1 = method1(originalDetails);
        Restriction r2 = method2(originalDetails);
        List<Restriction> list = new ArrayList();
        list.add(r1);list.add(r2);
        return list;
    }

    private Restriction method1(TeamResponseDto originalDetails){
        if(something){
            return new Restriction();
        }
        return new Restriction(originalDetails);
    }

    private Restriction method2(TeamResponseDto originalDetails){
        return new Restriction(originalDetails);
    }
}

作為替代方案,目前,我在父方法中創建了一個空列表,並將其作為參數傳遞給子方法。 在方法內部,檢查列表是否為空,獲取數據並填充列表,否則使用該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM