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;
    }

}