7.3. 对象、枚举和 UML 图¶
7.3.1. 目标¶
回顾面向对象编程
探索枚举类型
探索 switch 语句
解释 UML 图
7.3.2. Java 提示¶
在接下来的讨论中,我们将引用以下 Bank 类:
The Bank Class
import java.util.Scanner;
import java.text.DecimalFormat;
public class Bank {
static long accountID;
static String accountHolder;
static double accountBalance;
static String PIN;
static final double withdrawalTransactionCharge = 0.50; // $0.50 charge for
// each transaction
private static DecimalFormat df = new DecimalFormat("#.##");
public enum Choice{
DEPOSIT, WITHDRAW, DISPLAY, EXIT
}
public Bank() {
init();
}
public static void init() {
accountHolder = "J. Doe";
accountBalance = 500.00;
accountID = 555444333;
PIN = "1234";
}
public static void withdraw(double amount) {
if ((amount + withdrawalTransactionCharge) < accountBalance) {
accountBalance = accountBalance - amount
- withdrawalTransactionCharge;
System.out.println("withdrawing $" + df.format(amount));
}
else {
System.out.println(
"low account balance, cannot complete withdrawal transaction");
}
displayAccountBalance();
}
public static void deposit(double amount) {
accountBalance = accountBalance + amount;
System.out.println("depositing $" + df.format(amount));
displayAccountBalance();
}
public static void displayMenu() {
StringBuilder buffer = new StringBuilder();
buffer.append("*****Welcome to ABC Bank*****");
buffer.append("\n");
buffer.append("\n");
buffer.append("1: Withdraw $20.00");
buffer.append("\n");
buffer.append("2: Deposit $20.00");
buffer.append("\n");
buffer.append("3: Display Balance");
buffer.append("\n");
buffer.append("\n");
buffer.append(
"Please enter your choice of 1, 2, or 3, and press the Enter key");
buffer.append("\n");
System.out.println(buffer.toString());
}
public static void displayAccountBalance() {
StringBuilder buffer = new StringBuilder();
buffer.append("-----Account Details----- ");
buffer.append("\n");
buffer.append("Account ID: ");
buffer.append(accountID);
buffer.append("\n");
buffer.append("Holder: ");
buffer.append(accountHolder);
buffer.append("\n");
buffer.append("Balance: $");
buffer.append(df.format(accountBalance));
buffer.append("\n");
buffer.append("-------------------------");
buffer.append("\n");
buffer.append("-------------------------");
buffer.append("\n");
buffer.append("\n");
System.out.println( buffer.toString());
}// end of displayAccountDetails Method
public static void main(String[] args) {
init(); // Initializes this account
displayMenu();
String response = new Scanner(System.in).nextLine(); // Read user input
if (response.equals("1")) {
withdraw(20.00);
}
else if (response.equals("2")) {
deposit(20.00);
}
else if (response.equals("3")) {
displayAccountBalance();
}
else {
System.out.println("You entered an invalid choice.");
}
System.out.println("Thank you for banking with us, goodbye!");
}
}
7.3.2.1. Java 枚举¶
枚举类型提供了一种可以分配预定义常量值集合的类型。与字符串相比,使用枚举类型提供了有界的常量值集合,与整数相比,提供了更具描述性和可读性的值集合。例如,与其使用 1 到 7 的数字来表示星期几,我们可以声明:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
枚举类型可以位于其自己的文件中,也可以嵌套在另一个类中。当你知道所有可能的值是在编译时确定时,应该使用枚举类型。例如,一年中的月份、指南针上的方向、菜单中的选项或游戏中的位置。枚举类型可以提高类型安全性,特别是当方法的参数是枚举类型时。枚举类型可以使用 == 运算符和 switch 语句进行比较。
关于枚举类型的更多细节,请参见: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html。
我们将使用枚举类型与 switch 语句(下文将讨论)来实验 Bank.java
7.3.3. switch 语句¶
switch 语句可用于根据变量的多个可能值来控制执行流程。它们通常与枚举类型一起使用,但也可与某些基本类型(如 int 和 char)或 String 和某些包装类(如 Integer 和 Character)一起使用。
switch 语句可用于替代一系列 if 语句或嵌套的 if-else 语句。例如,在 Bank.java 代码...
if (response.equals("1")) {
withdraw(20.00);
}
else if (response.equals("2")) {
deposit(20.00);
}
else if (response.equals("3")) {
displayAccountBalance();
}
else {
System.out.println("You entered an invalid choice.");
}
可以用以下方法替换:
switch (response) {
case "1":
withdraw(20.00);
break;
case "2":
deposit(20.00);
break;
case "3":
displayAccountBalance();
break;
default:
System.out.println("You entered an invalid choice.");
}
注意,在此示例中,每个案例都包含一个 break 语句。如果没有 break 语句,switch 语句中的额外代码行将执行。
给定以下枚举类型:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
一个示例 switch 语句可能是:
switch(today) {
case SATURDAY:
System.out.println("Stores are crowded today");
break;
case MONDAY:
case TUESDAY:
System.out.println("Stores are stocked up today");
break;
case WEDNESDAY:
System.out.println("It's double coupon day");
default:
System.out.println("Happy shopping!");
}
注意,当今天是 星期一 时,它将落入 星期二 情况的代码。当今天是 星期三 时,它将打印 It’s double coupon day 并落入默认消息的打印。
关于 switch 语句的更多细节,参考: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html。
7.3.3.1. 十进制格式化¶
java.text.DecimalFormat 类提供了格式化实数输出的功能。例如在示例 Bank.java 中, df 字段被声明:
private static DecimalFormat df = new DecimalFormat("0.00");
因此,在整个类中,可以使用 DecimalFormat 对象将数字格式化为字符串。例如:
System.out.println("withdrawing $" + df.format(amount));
或
buffer.append(df.format(accountBalance));
注意,也可以使用以下格式,但它不会添加前导或尾随零:
private static DecimalFormat df = new DecimalFormat("#.##");
关于十进制格式的更多细节,参考: https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html。
7.3.3.2. Java UML 图表 [6:50]¶
Follow Along and Engage
下载与视频对应的幻灯片。观看视频时,在幻灯片上记笔记,并亲自练习绘制图表!
A UML Diagram from the example in the video 7.3.2.4-UMLDiagramKey.pdf
Note
创建 UML 图表将不是本课程的要求。然而,知道如何创建和解释它们是有用的,因为它们在业界常用于解释复杂系统。
