В Java, как я могу по-разному относиться к пустым конструкторам классов при оценке состояния emptyConstructor? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь сделать так, чтобы консоль печатала «пустой конструктор с именем» для каждого пустого конструктора класса с параметрами по умолчанию и «конструктор с параметрами с именем» для каждого конструктора класса, содержащего указанные параметры.Как вы можете видеть в классе Main, myAccount и yourAccount являются пустыми конструкторами, и только у johnnysAccount есть указанные параметры.

Вот мой класс Main.

public class Main {
    public static void main(String[] args) {
        BankAccount myAccount = new BankAccount();
        BankAccount yourAccount = new BankAccount();
        BankAccount johnnysAccount = new BankAccount("Mr. Appleseed", 533333202258L,
                8121283434L, "jappleseed@applecorp.co", 470.45);
    }
}

Как вы можете видеть вКласс BankAccount, консоль должна выводить другое сообщение для пустых конструкторов с параметрами по умолчанию, чем для конструкторов с указанными параметрами.

Вот мой класс BankAccount.

public class BankAccount {
    private String customer;
    private long number;
    private long telephone;
    private String email;
    private double balance;
    private boolean emptyConstructor;

    public BankAccount() {
        this("Nobody", 111111111111L, 18008888888L, "email@email.com", 0.00);
        emptyConstructor = true;
        System.out.println(emptyConstructor);
        if(emptyConstructor) {
            System.out.println("Empty constructor called.");
        }
    }

    public BankAccount (String customer, long number, long telephone, String email, double balance) {
        this.customer = customer;
        this.number = number;
        this.telephone = telephone;
        this.email = email;
        this.balance = balance;
        emptyConstructor = false;
        System.out.println(emptyConstructor);
        if(!emptyConstructor) {
            System.out.println("Constructor with parameters called.");
        }
    }
}

Это мой вывод.

false
Constructor with parameters called.
true
Empty constructor called.
false
Constructor with parameters called.
true
Empty constructor called.
false
Constructor with parameters called.

Как и ожидалось, emptyConstructor оценивается как false и выводит конструктор с параметрами, называемыми "для johnnysAccount, в последних двух строках вывода.Однако оказывается, что для двух пустых конструкторов myAccount и yourAccount emptyConstructor оценивается как false, а затем true, печатая оба сообщения.Я могу получить желаемый результат, только если закомментирую

this("Nobody", 111111111111L, 18008888888L, "email@email.com", 0.00);

Однако я бы предпочел оставить параметры по умолчанию на месте.Есть ли другой способ, которым я могу сделать так, чтобы emptyConstructor вычислял только значение true и печатал только сообщение «пустой конструктор с именем» для пустых конструкторов с параметрами по умолчанию?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Это будет более читабельным ... если вы назначите значение по умолчанию в конструкторе без аргументов, также

public BankAccount() {
    System.out.println("Empty constructor called.");
    this.customer = "Nobody";
    this.number = 111111111111L;
    this.telephone = 18008888888L;
    this.email = "email@email.com";
    this.balance = 0.00;
}

public BankAccount (String customer, long number, long telephone, String email, double balance) {
    System.out.println("Constructor with parameters called.");
    this.customer = customer;
    this.number = number;
    this.telephone = telephone;
    this.email = email;
    this.balance = balance;
}
0 голосов
/ 26 декабря 2018

Может быть приватный конструктор, такой как:

private BankAccount (String customer, long number, long telephone, String email, double balance, boolean calledFromNoArgConstructor) {
    this.customer = customer;
    this.number = number;
    this.telephone = telephone;
    this.email = email;
    this.balance = balance;
    if(calledFromNoArgConstructor) {
        System.out.println("Empty constructor called.");
    } else {
        System.out.println("Constructor with parameters called.");
    }
}

, тогда публичные конструкторы могут делегировать приватному конструктору:

public BankAccount() {
    this("Nobody", 111111111111L, 18008888888L, "email@email.com", 0.00, true);
}

public BankAccount (String customer, long number, long telephone, String email, double balance) {
    this(customer, number, telephone, email, balance, false);
}
...