簡體   English   中英

在其getter中調用數據成員的setter

[英]Calling a data member's setter in its getter

這個問題有點類似於我在這個論壇上問的另一個問題

這是我要完成的工作。 我有以下課程:

public class LoginPage
{
    // Class Data
    private HtmlForm loginForm;

    // Calling the constructor of the parent class
    public LoginPage()
    {
        loginForm = null;
    }

    public void setLoginForm()
    {
        ...... logic to find the login form ........
    }

    public HtmlForm getLoginForm()
    {
        return loginForm;
    }

    ...... other login related methods ........
}

我想確保每次調用getLoginForm()方法時都不應返回null。 一種方法是確保在調用getLoginForm()方法之前調用setLoginForm()。

我可以在其getter方法中調用數據成員的setter嗎? 在這種情況下:

    public HtmlForm getLoginForm()
    {
        setLoginForm()
        return loginForm;
    }

我從未見過像這樣的事情正在被實踐。 這有效嗎? 這樣做的優點和缺點是什么?

感謝您的意見/建議!

通常的模式如下:

public class LoginPage {

    // Class Data
    private HtmlForm loginForm;

    // Calling the constructor of the parent class
    public LoginPage() {
        loginForm = null;
    }

    // Normal setter - NB: Private - so I am in complete control.
    private void setLoginForm(HtmlForm loginForm) {
        this.loginForm = loginForm;
    }

    private void initialiseLoginForm() {
        if ( loginForm == null ) {
            // Build a loginForm and use the private setter to set it.
            // NB: In a multi-threaded environment you would normally use some kind of synchronization.
            HtmlForm newForm;
            // ...
            setLoginForm(newForm);
        }
    }

    // Normal getter
    public HtmlForm getLoginForm() {
        initialiseLoginForm();
        return loginForm;
    }

}

這會延遲創建表單,並禁止用戶對其進行修改。 請注意,我為setter使用了正確的簽名,通常是setXxx(T it)

是否有效? 當然。

這是個好主意嗎? 很難說-取決於情況。

基本上,這是一個“懶惰”的吸氣劑。 如果對象尚未初始化,請確保已初始化,然后將其返回。

無關,但我認為該方法的名稱不正確,應該反映出更接近其功能的內容,例如initLoginFormfindLoginForm等。

從技術上講,它是有效的,並且它是否有用,取決於情況……節省一些內存資源可能很有用,但是您應該做一個很小但可能非常有效的更改……(請參見下面的內容)

我想確保每次調用getLoginForm()方法時都不應返回null。

首先,您可能應該將setLoginForm()方法重命名為initLoginForm() 原因是setLoginForm()實際上不是設置方法,它用於初始化登錄表單的資源。

設置員看起來像這樣:

    public void setLoginForm(HtmlForm loginForm) {
       this.loginForm = loginForm; // set the login form
    }

現在,你有它的方式就是你所謂setLoginForm()每次調用getLoginForm()這是不必要的。 您想要的是在返回LoginForm之前將其初始化 null ,以實例化LoginForm (這稱為延遲初始化 )。

延遲初始化意味着我們直到第一次需要它們時才創建對象。 它是有用的內存保留技術,因為它避免了創建某些資源直到首次需要該資源時,從而釋放了寶貴的內存空間。 當對象初始化非常昂貴時,它特別有用。

因此,您可以使自己的getter變得“懶惰”:

    public HtmlForm getLoginForm() {
        if(loginForm == null) { //first call to this method.
            loginForm = new HtmlForm();
        }
        return loginForm;
    }

== null檢查應該更改為,但是在您的系統設計中,您將檢查“ Is LoginForm已實例化 ”。

我想更一般地說,您的代碼可能如下所示:

    public HtmlForm getLoginForm() {
        if(!isLoginFormInitialized()) { //initialize the login form if it isn't initialized
            initLoginForm();
        }
        return loginForm;
    }

這樣,您仍然可以確保您的loginForm已初始化,但不會通過每次重新創建來浪費資源。

注意:由於您沒有提供有關基礎系統的任何規范以及如何設置登錄表單,因此您是否允許null值,您可能使用的設計模式等。我只是對您所詢問的內容提供了一個一般性的答案。 。 希望它會有所幫助:)

確定您可以做到,但這絕不是好主意。

通常,將在MVC概念下設計一個不錯的應用程序:

MVC:模型-視圖-控制器

模型 :您的對象,例如用戶(屬性和Getter + Setter),產品,類別等。 getter和Setters不應具有任何邏輯,而只能設置或獲取值。

查看 :您的GUI

控制器 :執行邏輯,計算,數據庫等的ManagedBean。

如果要檢查AND / OR初始化任何值,請在Controller中而不是在Model中執行!

通常,setter方法需要使用參數來設置值:

public void setData(DataType data ){
   this.data = data;
}

暫無
暫無

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

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