出典: Medium 今日は、銀行システム用の単純な Java アプリケーションを開発します。これは、OOP の概念が Java プログラムでどのように使用されるかをより深く理解するのに役立ちます。 まず、コンピュータに Java 環境 (できれば Java 11) がインストールされている必要があります。次に、コンソール アプリケーションの機能の詳細な説明から始めます。 機能:
- アカウントを作成する;
- 入力して終了します。
- 過去 5 件のトランザクションの表示。
- 現金デポジット;
- 現在のユーザー情報を表示します。
- 継承;
- 多態性。
- カプセル化。
アプリケーション開発
Eclipse または IntelliJ IDEA で新しい Java プロジェクトを作成しましょう。SavingsAccountという新しいインターフェースを定義してみましょう。public interface SavingsAccount {
void deposit(double amount, Date date);
}
デポジットメソッド をホストするインターフェイスを実装しました。私は当座預金口座にお金を追加するたびにこのメソッドを呼び出します。ここで使用される OOP の概念はポリモーフィズムです(インターフェイス内のメソッドには本体がありません)。このメソッドの実装は、同じ名前とパラメータを持つメソッドをオーバーライドすることによって、Customerクラスで見つけることができます。このようにして、子クラスの親インターフェイスからメソッドをオーバーライドします。次に、クライアントに当座預金口座にお金を追加してもらう必要があります。まず、Customerクラスを定義しましょう。
public class Customer extends Person implements SavingsAccount {
private String username;
private String password;
private double balance;
private ArrayList<String> transactions = new ArrayList<>(5);
public Customer(String firstName, String lastName, String address, String phone, String username, String password, double balance, ArrayList<String> transactions, Date date) {
super(firstName, lastName, address, phone);
this.username = username;
this.password = password;
this.balance = balance;
addTransaction(String.format("Initial deposit - " + NumberFormat.getCurrencyInstance().format(balance) + " as on " + "%1$tD" + " at " + "%1$tT.", date));
}
private void addTransaction(String message) {
transactions.add(0, message);
if (transactions.size() > 5) {
transactions.remove(5);
transactions.trimToSize();
}
}
//Getter Setter
public ArrayList<String> getTransactions() {
return transactions;
}
@Override
public void deposit(double amount, Date date) {
balance += amount;
addTransaction(String.format(NumberFormat.getCurrencyInstance().format(amount) + " credited to your account. Balance - " + NumberFormat.getCurrencyInstance().format(balance) + " as on " + "%1$tD" + " at " + "%1$tT.", date));
}
@Override
public String toString() {
return "Customer{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", balance=" + balance +
", transactions=" + transactions +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Customer customer = (Customer) o;
if (Double.compare(customer.getBalance(), getBalance()) != 0) return false;
if (getUsername() != null ? !getUsername().equals(customer.getUsername()) : customer.getUsername() != null)
return false;
if (getPassword() != null ? !getPassword().equals(customer.getPassword()) : customer.getPassword() != null)
return false;
return getTransactions() != null ? getTransactions().equals(customer.getTransactions()) : customer.getTransactions() == null;
}
@Override
public int hashCode() {
int result;
long temp;
result = getUsername() != null ? getUsername().hashCode() : 0;
result = 31 * result + (getPassword() != null ? getPassword().hashCode() : 0);
temp = Double.doubleToLongBits(getBalance());
result = 31 * result + (int) (temp ^ (temp >>> 32));
result = 31 * result + (getTransactions() != null ? getTransactions().hashCode() : 0);
return result;
}
CustomerクラスがPersonクラスからプロパティを受け取るため、 ここで使用される OOP の概念は継承です。つまり、Personクラスのほぼすべての属性が継承され、親子関係がPersonからCustomerまで表示されます。次に、2 つのクラスのすべての属性を備え、継承された属性を指定するスーパーコンストラクター キーワードを追加するコンストラクターが必要です。SavingsAccountインターフェースを実装するときは、 Customerクラスの入金メソッドをオーバーライドする必要があります。これを行うには、このクラスにメソッドの実装を作成します。さらに、トランザクション リストは、最後の 5 つのトランザクションを表示するように初期化されます。コンストラクターはaddTransactionメソッドを呼び出し、変更と完了したトランザクションの日付を表示します。
private void addTransaction(String message) {
transactions.add(0, message);
if (transactions.size() > 5) {
transactions.remove(5);
transactions.trimToSize();
}
}
次に、親クラスpersonについて話しましょう。
public class Person {
private String firstName;
private String lastName;
private String address;
private String phone;
public Person() {}
public Person(String firstName, String lastName, String address, String phone) {
this.firstName = firstName;
this.lastName = lastName;
this.address = address;
this.phone = phone;
}
//Getters Setters
@Override
public String toString() {
return "Person{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", address='" + address + '\'' +
", phone='" + phone + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (getFirstName() != null ? !getFirstName().equals(person.getFirstName()) : person.getFirstName() != null)
return false;
if (getLastName() != null ? !getLastName().equals(person.getLastName()) : person.getLastName() != null)
return false;
if (getAddress() != null ? !getAddress().equals(person.getAddress()) : person.getAddress() != null)
return false;
return getPhone() != null ? getPhone().equals(person.getPhone()) : person.getPhone() == null;
}
@Override
public int hashCode() {
int result = getFirstName() != null ? getFirstName().hashCode() : 0;
result = 31 * result + (getLastName() != null ? getLastName().hashCode() : 0);
result = 31 * result + (getAddress() != null ? getAddress().hashCode() : 0);
result = 31 * result + (getPhone() != null ? getPhone().hashCode() : 0);
return result;
}
Personクラス では、各属性にprivateアクセス修飾子を適用することでカプセル化の概念を使用しました。Java のカプセル化は、このデータを操作するメソッドを 1 つのユニットに結合するメカニズムとして定義できます。基本的に、Person クラスのデータはこのクラスでのみ使用でき、他のクラスやパッケージでは使用できません。そして最後に、 Bankと呼ばれるメインクラスです。これは、アプリケーションを実行し、すべてのクラスの機能と対話するメイン クラスです。
public class Bank {
private static double amount = 0;
Map<String, Customer> customerMap;
Bank() {
customerMap = new HashMap<String, Customer>();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Customer customer;
Bank bank = new Bank();
int choice;
outer:
while (true) {
System.out.println("\n-------------------");
System.out.println("BANK OF JAVA");
System.out.println("-------------------\n");
System.out.println("1. Registrar cont.");
System.out.println("2. Login.");
System.out.println("3. Exit.");
System.out.print("\nEnter your choice : ");
choice = sc.nextInt();
sc.nextLine();
switch (choice) {
case 1:
System.out.print("Enter First Name : ");
String firstName = sc.nextLine();
System.out.print("Enter Last Name : ");
String lastName = sc.nextLine();
System.out.print("Enter Address : ");
String address = sc.nextLine();
System.out.print("Enter contact number : ");
String phone = sc.nextLine();
System.out.println("Set Username : ");
String username = sc.next();
while (bank.customerMap.containsKey(username)) {
System.out.println("Username already exists. Set again : ");
username = sc.next();
}
System.out.println("Set a password:");
String password = sc.next();
sc.nextLine();
customer = new Customer(firstName, lastName, address, phone, username, password, new Date());
bank.customerMap.put(username, customer);
break;
case 2:
System.out.println("Enter username : ");
username = sc.next();
sc.nextLine();
System.out.println("Enter password : ");
password = sc.next();
sc.nextLine();
if (bank.customerMap.containsKey(username)) {
customer = bank.customerMap.get(username);
if (customer.getPassword().equals(password)) {
while (true) {
System.out.println("\n-------------------");
System.out.println("W E L C O M E");
System.out.println("-------------------\n");
System.out.println("1. Deposit.");
System.out.println("2. Transfer.");
System.out.println("3. Last 5 transactions.");
System.out.println("4. User information.");
System.out.println("5. Log out.");
System.out.print("\nEnter your choice : ");
choice = sc.nextInt();
sc.nextLine();
switch (choice) {
case 1:
System.out.print("Enter amount : ");
while (!sc.hasNextDouble()) {
System.out.println("Invalid amount. Enter again :");
sc.nextLine();
}
amount = sc.nextDouble();
sc.nextLine();
customer.deposit(amount, new Date());
break;
case 2:
System.out.print("Enter beneficiary username : ");
username = sc.next();
sc.nextLine();
System.out.println("Enter amount : ");
while (!sc.hasNextDouble()) {
System.out.println("Invalid amount. Enter again :");
sc.nextLine();
}
amount = sc.nextDouble();
sc.nextLine();
if (amount > 300) {
System.out.println("Transfer limit exceeded. Contact bank manager.");
break;
}
if (bank.customerMap.containsKey(username)) {
Customer payee = bank.customerMap.get(username); //Todo: check
payee.deposit(amount, new Date());
customer.withdraw(amount, new Date());
} else {
System.out.println("Username doesn't exist.");
}
break;
case 3:
for (String transactions : customer.getTransactions()) {
System.out.println(transactions);
}
break;
case 4:
System.out.println("Titularul de cont cu numele: " + customer.getFirstName());
System.out.println("Titularul de cont cu prenumele : " + customer.getLastName());
System.out.println("Titularul de cont cu numele de utilizator : " + customer.getUsername());
System.out.println("Titularul de cont cu addresa : " + customer.getAddress());
System.out.println("Titularul de cont cu numarul de telefon : " + customer.getPhone());
break;
case 5:
continue outer;
default:
System.out.println("Wrong choice !");
}
}
} else {
System.out.println("Wrong username/password.");
}
} else {
System.out.println("Wrong username/password.");
}
break;
case 3:
System.out.println("\nThank you for choosing Bank Of Java.");
System.exit(1);
break;
default:
System.out.println("Wrong choice !");
}}}}
java.utilライブラリ を使用して、 Scannerを呼び出してキーボードを読み取ります。Bankとして知られる定義を通じてCustomerオブジェクトをキャストすることにより、 Bank()型の新しいオブジェクトを作成します。しばらくすると、スタートメニューが表示されます。nextLineを使用すると、キーボードから追加された番号が読み取られます。以下に、クライアント データであるマップを保存する新しいコンストラクターがあります。Map.put は、顧客データの保存または更新に使用されます。customer = new Customer(名、姓、住所、電話番号、ユーザー名、パスワード、新しい日付());
bank.customerMap.put(username, customer);
接続がある場合は、オプションを含む新しいメニューが表示されます。whileとswitch を使用してアプリケーション機能を呼び出すことでも、同じアプローチが機能します。ステージ 1: 現在のアカウントに資金を追加します。ステップ 2: 最新の 5 つのトランザクションを表示します。ステージ 3: クライアント データをカードからコンソールに出力します。ステージ 4: メニューを閉じます。プログラムのソース コードはここにあります。この例が、Java での OOP 概念の使用にもっと慣れるのに役立つことを願っています。
GO TO FULL VERSION