Java 调用数据成员';他是一个有着巨大潜力的二传手
这个问题和我在这个论坛上问的另一个问题有点关联 以下是我正在努力实现的目标。我有以下课程:Java 调用数据成员';他是一个有着巨大潜力的二传手,java,Java,这个问题和我在这个论坛上问的另一个问题有点关联 以下是我正在努力实现的目标。我有以下课程: public class LoginPage { // Class Data private HtmlForm loginForm; // Calling the constructor of the parent class public LoginPage() { loginForm = null; } public void
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;
}
我从来没有见过这样的事情被练习过这有效吗?这样做的优点和缺点是什么?
感谢您的评论/建议 它“有效”吗?当然
这是个好主意吗?很难说——取决于具体情况
它基本上是一个“懒惰”的获得者;如果对象尚未初始化,请确保已初始化,然后将其返回
不相关,但我认为该方法命名错误,应该反映更接近它所做的事情,例如,initLoginForm
,findloginfo
,等等。它是否“有效”?当然
这是个好主意吗?很难说——取决于具体情况
它基本上是一个“懒惰”的获得者;如果对象尚未初始化,请确保已初始化,然后将其返回
与此无关,但我认为该方法命名错误,应该反映更接近它所做的事情,例如,
initLoginForm
,findLoginForm
,等等。从技术上讲,它是有效的,至于它是否有用,则取决于具体情况。。。这可能有助于节省一些内存资源,但你应该做一个小但可能非常有效的更改。。。(见下文)
我想确保每次调用getLoginForm()方法时,它都不应返回null
首先,您可能应该将setLoginForm()
方法重命名为类似initLoginForm()
的名称。原因是setLoginForm()
不是真正的setter,它用于初始化登录表单的资源
二传手应该是这样的:
public void setLoginForm(HtmlForm loginForm) {
this.loginForm = loginForm; // set the login form
}
现在,您的方式是每次调用getLoginForm()
时都调用setLoginForm()
,这是不必要的。您需要的是,仅当LoginForm
为空时,才在返回它之前实例化它(称为)
惰性初始化意味着我们直到第一次需要对象时才创建它们。
它是一种非常有用的内存保存技术,因为它避免在首次需要资源之前创建某些资源,从而释放宝贵的内存空间。当对象初始化很昂贵时,它特别有用
所以你让你的getter变得“懒惰”:
==null
检查应更改为,但在系统设计中,您应检查“是否已实例化loginForm”
我想更一般地说,您的代码可能如下所示:
public HtmlForm getLoginForm() {
if(!isLoginFormInitialized()) { //initialize the login form if it isn't initialized
initLoginForm();
}
return loginForm;
}
这样,您仍然可以确保您的loginForm
已初始化,但每次重新创建它不会浪费资源
注意:由于您没有提供基础系统的任何规范以及如何设置登录表单,您是否允许
null
值、您可能使用的设计模式等。我只是对您提出的问题给出了一般性的回答。希望它能有所帮助:)从技术上讲,它是有效的,至于它是否有用,则取决于具体情况。。。这可能有助于节省一些内存资源,但你应该做一个小但可能非常有效的更改。。。(见下文)
我想确保每次调用getLoginForm()方法时,它都不应返回null
首先,您可能应该将setLoginForm()
方法重命名为类似initLoginForm()
的名称。原因是setLoginForm()
不是真正的setter,它用于初始化登录表单的资源
二传手应该是这样的:
public void setLoginForm(HtmlForm loginForm) {
this.loginForm = loginForm; // set the login form
}
现在,您的方式是每次调用getLoginForm()
时都调用setLoginForm()
,这是不必要的。您需要的是,仅当LoginForm
为空时,才在返回它之前实例化它(称为)
惰性初始化意味着我们直到第一次需要对象时才创建它们。
它是一种非常有用的内存保存技术,因为它避免在首次需要资源之前创建某些资源,从而释放宝贵的内存空间。当对象初始化很昂贵时,它特别有用
所以你让你的getter变得“懒惰”:
==null
检查应更改为,但在系统设计中,您应检查“是否已实例化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和setter不应该有任何逻辑,只是设置或获取值
查看:您的GUI
控制器:执行逻辑、计算、数据库等的ManagedBeans
如果要检查和/或初始化任何值,请执行以下操作
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;
}
}