[英]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)
。
是否有效? 當然。
這是個好主意嗎? 很難說-取決於情況。
基本上,這是一個“懶惰”的吸氣劑。 如果對象尚未初始化,請確保已初始化,然后將其返回。
無關,但我認為該方法的名稱不正確,應該反映出更接近其功能的內容,例如initLoginForm
, findLoginForm
等。
從技術上講,它是有效的,並且它是否有用,取決於情況……節省一些內存資源可能很有用,但是您應該做一個很小但可能非常有效的更改……(請參見下面的內容)
我想確保每次調用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.