MengBridgeCourse 中文版

第 7 章 测试与异常

| 关于   英文版   «  7.2. 关于异常   ::   目录   ::   7.4. 关于多态性的更多内容  »

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

下载与视频对应的幻灯片。观看视频时,在幻灯片上记笔记,并亲自练习绘制图表!

Video Slides 7.3.2.1-JavaOOPUML.pdf
A UML Diagram from the example in the video 7.3.2.4-UMLDiagramKey.pdf

Note

创建 UML 图表将不是本课程的要求。然而,知道如何创建和解释它们是有用的,因为它们在业界常用于解释复杂系统。

7.3.4. 检查点 1

7.3.5. 编程练习:面向对象的编程

   «  7.2. 关于异常   ::   目录   ::   7.4. 关于多态性的更多内容  »

关闭窗口