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

时间:2017-02-21 07:27:33

标签: java

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

或者,我可以执行以下操作:

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

td = datetime.datetime.today() - datetime.datetime.today()
days = td.days + (1 if td.seconds or td.microseconds else 0)

5 个答案:

答案 0 :(得分:4)

所有好的答案,但他们实际上"想念" "真实"问题;那就是:你没有放下构造函数,因为可以

您可以创建满足要求所需的代码。换句话说:你退后一步;并且你想出分别设计"预期的用例"为您的银行帐户类。

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

示例:允许 ID /所有者字段非常危险。这会使那些字段的值为null;这意味着你要么在这里和那里需要大量的检查;如果你忘记了这里或那里;你迟早会遇到NullPointerExceptions(很快就会)。

请记住:您的对象旨在代表(型号!)"现实"。实际上,银行账户在没有所有者的情况下并不存在;或者是身份证。

从这个意义上讲,你的课程的理智实现更像是:

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代表货币。这是一个超级基本的事情: money 不应该使用浮点数表示! (你会期待BigDecimal类;或者只是使用 int 而不是double(并代表1.75 $为175美分)
  • 只看一眼真实的现实世界:如今,你不会为银行账户建模以获得当前的平衡"。相反,银行帐户可能附属于历史事件(表示存款和支付交易)。

最后一点:对于你目前的练习,那种"验证"提款/存款是"好的&#34 ;;在现实世界中#34;验证可能会在许多其他地方发生。 (回到我最初的陈述:这完全取决于你的模型;一个简单的模型可以说银行账户本身就是"验证"事情;但更现实的解决方案是你有其他组件处理"规则","法律"以及进行"验证")的各种主题。

答案 1 :(得分:1)

根据要使用的构造函数创建对象。例如,要使用第一个构造函数,您需要三个参数,如

BankAccount first = new BankAccount("Bob", "ID45", 400.50);

并且要使用第二个构造函数,您只需要一个参数,余额就像这样,

BankAccount second = new BankAccount(400.50);

他们都会创建BankAccount的实例,但区别在于创建时,第一个银行帐户将填写字段ownerNameaccountId,而第二个银行帐户将有这些字段设置为空字符串值。但是,与第一个对象的余额400.5

不同,第二个对象的余额为0

编辑:与用户ScaryWombat建议的一样,第二个构造函数中存在一个缺陷,因为如果要定义一个余额为0的对象,那么添加balance就没有意义了参数。此外,在这种情况下,建议您也为其他字段提供默认值,

public BankAccount() {
    ownerName = "unknown";
    accountId = "unknown";
    accountBalance = 0;
}

现在,当您使用此构造函数创建BankAccount的实例时,它将具有默认值“未知”,“未知”和0。

BankAccount third = new BankAccount();

此外,对于fee部分,您所要做的就是不仅在BankAccountfee中创建另一个字段,而且还创建一个setter方法以允许用户设定费用,

private double fee;
.
.
.
public void setFee (double fee) {
   this.fee = fee;
}

在main方法中,用户可以使用以下内容访问它,

BankAccount account = new BankAccount("Fred", "ID145", 400);
account.setFee(15); //this will set the fee to 15

答案 2 :(得分:1)

你可以这样做:

   public BankAccount(String ownerName, String accountId, double accountBalance) {
       this.ownerName = ownerName;
       this.accountId = accountId;
       this.accountBalance = accountBalance;
   }

   public BankAccount() {
       this("some default name", "some default id", 0.0);
   }

答案 3 :(得分:1)

如果您想创建零余额的BankAccount,那么

public BankAccount(String ownerName, String accountId, double accountBalance) {
    this.ownerName = ownerName;
    this.accountId = accountId;
    this.accountBalance = accountBalance;
}

public BankAccount() {
    this.accountBalance = 0;
}

您可以将它们实例化为

BankAccount mine = new BankAccount("Scary", "123", 1000000.00);
BankAccount empty = new BankAccount();

修改

如果您选择使用第二种方法构建方法,idowner也会null,可能不是很有用

答案 4 :(得分:1)

您无法使用两个构造函数创建一个银行帐户对象。您只需调用两个构造函数中的一个来创建新对象。所以你要么:

BankAccount account = new BankAccount("Sweeper", "ABCDEF", 10000);

或:

BankAccount account = new BankAccount(100000);

请注意,您的第二个构造函数的参数是没有意义的,因为无论参数是什么,您都将余额初始化为0:

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

我认为这更有意义:

public BankAccount() {
    this.accountBalance = 0;
}

至于你的第二个问题,我会给你一些提示。

您需要在类中添加一个名为fee的新字段。为它添加getter和setter。