如何防止对象在布尔方法中被写入?

时间:2018-04-02 06:13:12

标签: java object methods null boolean

我试图执行以下操作:

编写一个布尔方法,为模式添加一个帐户。

一个。它应该有一个rate参数和一个帐户类型参数。

湾如果该帐户尚未拥有该帐户,则该帐户将成为该帐户的第一个帐户;如果他们已经拥有一个帐户,则该帐户将成为第二个帐户。

℃。如果他们已经有两个帐户,则该方法返回false,否则返回 真。

以下是代码:

public class Assignment6 {
    public static void main(String[] args) {
        System.out.println(BankPatron.addAccount(11,AccountType.CD));
        System.out.println(BankPatron.addAccount(12,AccountType.CD));
        System.out.println(BankPatron.addAccount(13,AccountType.CD));
    }
}

class BankPatron {
    public static BankAccount account1;
    public static BankAccount account2;
    public static Boolean addAccount(double rate, AccountType type) {
        if (account1 == null) {
            BankAccount account1 = new BankAccount("","",rate,type);
            System.out.println(account1.getRate());
            return true;
        }
        else if (account2 == null) {
            BankAccount account2 = new BankAccount("","",rate,type);
            System.out.println(account2.getRate());
            return true;
        }
        else {
            return false;
        }
    }
}

返回:

11.0
true
12.0
true
13.0
true

这意味着account1对象被写了三次,对吧?如何在addAccount完成后让account1保存,这样一旦addAccount再次运行,它会看到account1不再为null?

3 个答案:

答案 0 :(得分:3)

if - 块中的局部变量会遮挡您的静态字段。

而不是:

if (account1 == null) {
    BankAccount account1 = new BankAccount("", "", rate, type);
    // ...
}

应该是:

if (account1 == null) {
    account1 = new BankAccount("", "", rate, type);
    // ...
}

最有可能的是,您还需要重构BankPatron以不使用static字段/方法,而是使用实例字段/方法。

这将允许你写:

BankPatron bankPatron = new BankPatron();
bankPatron.addAccount(11, AccountType.CD);
// ...

答案 1 :(得分:0)

如果条件允许,请避免在内部重新声明account1和account2。

if (account1 == null) {
            BankAccount account1 = new BankAccount("","",rate,type);
....
else if (account2 == null) {
        BankAccount account2 = new BankAccount("","",rate,type);

这应该是:

if (account1 == null) {
                account1 = new BankAccount("","",rate,type);
.....
else if (account2 == null) {
        account2 = new BankAccount("","",rate,type);

如果您的程序是多线程的,那么通过执行以下操作使此方法同步:

public synchronized static Boolean addAccount(double rate, AccountType type) { 

答案 2 :(得分:0)

在检查account1为空后,您正在创建新的BankAccount对象并将其分配给本地变量account1而不是“account1”字段。 在代码中查看此行

 BankAccount account1 = new BankAccount("","",rate,type);

此account1变量的范围将在if块内。因此,您的作业将发生在本地“account1”对象上,而不是静态字段“account1”

只需用以下代码替换这行代码:

account1 = new BankAccount("","",rate,type);

对else if块中的account2也进行类似的更改。 您将获得所需的结果

11.0
true
12.0
true
false