gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:02:02 24 4
gpt4 key购买 nike

我编写了以下代码和驱动程序,但我不确定如何使用两个构造函数创建银行帐户对象。一个构造函数获取初始余额,第二个构造函数开设一个没有钱的帐户。另外,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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com