java - 如何使用多个构造函数创建对象?

标签 java

我编写了以下代码和驱动程序,但我不确定如何使用两个构造函数创建银行帐户对象。一个构造函数获取初始余额,第二个构造函数开设一个没有钱的帐户。另外,accountBalance 是否应该包括有效性检查?

我可以选择执行以下操作:

将费用作为银行账户描述的一部分。根据需要更新 BankAccount 类。用户应该能够为每个帐户设置费用金额并通过某种方法添加费用。向驱动程序添加代码以演示收费功能。 (有人可以向我解释一下这是什么意思吗)

//Bank Account class   
import java.text.NumberFormat;

public class BankAccount {

private String ownerName;
private String accountId;
private double accountBalance;

public BankAccount(String ownerName, String accountId, double accountBalance) {
    this.ownerName = ownerName;
    this.accountId = accountId;
    if(accountBalance >= 0) { 
        this.accountBalance = accountBalance;           
    } else {
        System.out.println("Due to your negative account balace, you will be issued a fee.\n");
    }
}

public BankAccount(double accountBalance) {
    accountBalance = 0;
}

public String getOwnerName() {
    return ownerName;
}

public void setOwnerName(String ownerName) {
    this.ownerName = ownerName;
}

public String getAccountId() {
    return accountId;
}

public void setAccountId(String accountId) {
    this.accountId = accountId;
}

public double getAccountBalance() {
    return accountBalance;
}

public void setAccountBalance(double accountBalance) {
    if(accountBalance >= 0) { 
        this.accountBalance = accountBalance;           
    } else {
        System.out.println("Due to your negative account balace, you will be issued a fee.\n");
    }
}

public void withdraw(double amount) { 
    if(amount > 0 && amount < accountBalance) { 
        accountBalance -= amount;           
    } else {
        System.out.println("Invalid withdraw amount! Please try again.\n");
    }
}

public void deposit(double amount) { 
    if(amount > 0) { 
        accountBalance += amount;
    } else {
        System.out.println("Invalid deposit amount! Please try again.\n");
    }
}

public String toString() { 
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
    return "Account Owner's Name: " + ownerName + "\n" + "Account ID: " + accountId + "\n" + 
           "Balance in the account: " + currencyFormatter.format(accountBalance);
}
}

//Driver Program
public class BankAccountDriver {

public static void main(String[] args) {

    BankAccount myAccount = new BankAccount("Smith", "123jahgsd", 1200);                      
    myAccount.withdraw(0.453);
    myAccount.deposit(1000.1);
    System.out.println(myAccount);
}
}

最佳答案

所有的答案都很好,但他们实际上“错过”了“真正”的问题;那就是:你不会放下构造函数,因为你可以

您创建满足您的要求所需的代码。换句话说:你退后一步;然后您想出分别设计您的银行账户类别的“预期用例”。

需要考虑的事情是:您避免可以使用此类不同路径创建的类。

示例:允许 id/所有者字段是极其危险的。这使得这些字段具有 null 值;这意味着您要么需要到处进行大量检查;要么需要进行大量检查。如果你在这里或那里忘记了;你迟早会遇到 NullPointerExceptions(很快)。

请记住:您的对象旨在代表(模型!)“现实”。事实上,银行账户并不是没有所有者的。或 ID。

从这个意义上说,类的健全实现看起来更像是:

public class BankAccount {
  private final String owner;
  private final String id;
  private double currentBalance;

  public BankAccount(String owner, String id) {
    this(ownwer, id, 0);
  }

  public BankAccount(String owner, String id, double currentBalance) {
    this.owner = owner;
    ...

这里的注释:

  • 您希望防止所有者/ID 被更改,因此您将其定为最终版本;因此你也没有这些字段的setter方法
  • 在现实世界的解决方案中,您不会使用字符串来表示名称或 ID,而是使用不同的类
  • 您还永远不会使用double来表示货币。这是一个 super 基本的事情:金钱不应该用 float 表示! (您可能希望使用 BigDecimal 类;或者简单地使用 int 而不是 double (并将 1.75 美元表示为 175 美分)
  • 现实世界的一瞥:如今,您不会为银行帐户建模来获得“当前余额”。相反,银行帐户可能与事件的历史相关联(表示存款和付款交易)。

最后一点:对于您当前的练习,这种提款/存款的“验证”是“可以的”;在“现实世界”中,验证也可能发生在许多其他地方。 (回到我最初的声明:这完全取决于您的模型;一个简单的模型可以说银行帐户本身正在“验证”事物;但更现实的解决方案是您有其他处理“规则”的组件,“法律”和各种进行“验证”的主题)。

关于java - 如何使用多个构造函数创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42361099/

相关文章:

java - 将包含 JSON 的字符串转换为列表,然后将该列表添加回 JSON

Java XMLStreamWriter : Outputting Unicode extended characters (non-BMP)

java - Jboss启动时创建MDB队列连接时出现问题

java - 我可以从ftl中的函数调用宏吗

java - 如何读取 blob 的内容并将其写入 GAE 数据存储 (Java)

java - 无法使用 Eclipse 调试 Web 服务

java - Android Studio 1.5 和 Android 注解(由 excilys 提供)

java - 当同一类的不同实例在总线上注册时,Guava EventBus 抛出 handlerExcetion

Java hibernate加入继承(未找到)

java - MapMaker 设计模式?