Compare commits
20 Commits
o-matsuda
...
8fbfa99047
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8fbfa99047 | ||
|
|
1c4b834578 | ||
|
|
b8aa7238f6 | ||
|
|
d88468306f | ||
|
|
968c5094a4 | ||
|
|
3b6b23c883 | ||
|
|
f143cf7ec2 | ||
|
|
b58fcecaa2 | ||
|
|
d98145e598 | ||
|
|
3d026db061 | ||
|
|
38620e220f | ||
|
|
d4b07b24bf | ||
|
|
066af8799d | ||
|
|
e7a1d9851d | ||
|
|
27685ac25f | ||
|
|
3e82879f22 | ||
|
|
769fb977ca | ||
|
|
04da447bfe | ||
|
|
25802b8380 | ||
|
|
be15630c5b |
388
doc/Day02_コンストラクタ・カプセル化・static.md
Normal file
388
doc/Day02_コンストラクタ・カプセル化・static.md
Normal file
@@ -0,0 +1,388 @@
|
||||
# CUI_EM_OOP ミッション課題【2日目】コンストラクタ・カプセル化・static
|
||||
|
||||
## このミッションについて
|
||||
|
||||
このミッションは、最終的に **「社員メンテナンス(ファイルシステム版)」(CUI_EM_OOP)** を完成させることを目標にした、複数回に分かれたミッション課題の**2日目**です。
|
||||
|
||||
**前回(1日目)作成したプロジェクトのファイルを、そのまま引き続き使います。** 同じプロジェクトに追記・修正を加えていってください(`Book`、`Student`、`Item`、`EmployeeData`、`Main`、`BasicCheck1〜3`など)。
|
||||
|
||||
今日は、1日目に作った「まだ簡易版」のクラスたちを、今日習う道具を使って、完成形にぐっと近づけていきます。それでも、まだ以下の内容は習っていないため使いません。今後のミッションでさらにバージョンアップしていきます。
|
||||
|
||||
* 継承・多態性(`extends`、抽象クラス)
|
||||
* コレクション(`ArrayList`など)
|
||||
* 例外処理
|
||||
* ファイルの読み書き
|
||||
|
||||
## 今日の講義内容
|
||||
|
||||
* コンストラクタ
|
||||
* コンストラクタのオーバーロード
|
||||
* メソッドのオーバーライド(`Object`クラスの`toString`など)
|
||||
* アクセス修飾子
|
||||
* ゲッター・セッター
|
||||
* `static`、静的メンバ
|
||||
|
||||
## 基本の書き方(文法メモ)
|
||||
|
||||
今日はじめて出てくる書き方をまとめておきます。各段階で迷ったときは、ここに戻って確認してください。
|
||||
|
||||
### コンストラクタ
|
||||
|
||||
```java
|
||||
public class クラス名 {
|
||||
public クラス名() {
|
||||
// インスタンスが作られたときに実行される処理(何もしなくてもOK)
|
||||
}
|
||||
|
||||
public クラス名(型 引数名, 型 引数名) {
|
||||
// 引数を使ってフィールドを設定する処理
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
* コンストラクタの名前は、**必ずクラス名とまったく同じ**にします。
|
||||
* コンストラクタには**戻り値の型を書きません**(`void`も書きません)。ここがメソッドとの大きな違いです。
|
||||
* `new クラス名();`と書けば引数なしのコンストラクタが、`new クラス名(値, 値);`のように引数を渡せば対応する引数ありのコンストラクタが呼ばれます。渡す引数の数や型によって、Javaが自動的にどちらを実行するか選んでくれます。これを**コンストラクタのオーバーロード**と呼びます。
|
||||
* **注意**:Javaは本来、コンストラクタを1つも書かないクラスに対して「何もしない引数なしコンストラクタ」を自動的に用意してくれます。しかし、コンストラクタを1つでも自分で書くと、この自動生成は行われなくなります。そのため、引数なしでの生成もこれまで通り使いたい場合は、引数なしコンストラクタも自分で明示的に書く必要があります(5段階目で2つとも作るのはこのためです)。
|
||||
|
||||
### アクセス修飾子(`private`)
|
||||
|
||||
フィールドに`private`をつけると、そのフィールドは**自分のクラスの中からしか直接アクセスできなく**なります。クラスの外からは、これから作るゲッター・セッターというメソッドを経由してアクセスすることになります。
|
||||
|
||||
### ゲッター・セッターの命名ルール
|
||||
|
||||
* ゲッター:`get` + フィールド名(先頭を大文字にしたもの)というメソッド名にし、フィールドの値を`return`する。引数はなし。
|
||||
* 例:フィールド`price`(`int`型) → `public int getPrice() { return this.price; }`
|
||||
* セッター:`set` + フィールド名(先頭を大文字にしたもの)というメソッド名にし、引数で受け取った値をフィールドに代入する。戻り値は`void`。
|
||||
* 例:フィールド`price`(`int`型) → `public void setPrice(int price) { this.price = price; }`
|
||||
* 自分のクラスの中から自分のゲッター・セッターを呼び出すときは、`this.getPrice()`のように書いても、`this.`を省略して`getPrice()`のように書いても、どちらも同じ意味になります。
|
||||
|
||||
### `static`(静的メンバ)
|
||||
|
||||
フィールドやメソッドに`static`をつけると、そのフィールド・メソッドは**インスタンスごとではなく、クラス全体で1つだけ共有される**ものになります。
|
||||
|
||||
```java
|
||||
public class クラス名 {
|
||||
static 型 フィールド名;
|
||||
|
||||
public static 戻り値の型 メソッド名() {
|
||||
return フィールド名;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
呼び出すときは、インスタンス経由ではなく`クラス名.メソッド名()`のように、**クラス名から直接**呼び出します。
|
||||
|
||||
### メソッドのオーバーライドと`@Override`
|
||||
|
||||
すべてのクラスは、`Object`という共通のクラスを自動的に受け継いでいます(`extends`と書いていないクラスも、実は見えないところで`Object`を継承しています)。そのため、どのクラスも`toString`のようなメソッドを最初から持っています。この中身を自分のクラス用に書き直すことを**オーバーライド(Override)**と呼びます。
|
||||
|
||||
* オーバーライドするメソッドの前には`@Override`をつけましょう。これは「このメソッドは親のメソッドを上書きしていますよ」とJavaに伝えるための目印です。書き忘れても動作は変わりませんが、書いておくとメソッド名のスペルミスなどにJavaが気づいてくれるので、必ずつける習慣にしましょう。
|
||||
* **重要**:`toString`は`Object`クラスの中で`public`として宣言されています。オーバーライドする側は、元のメソッドより公開範囲を狭くすることができないというルールがあるため、**オーバーライドする`toString`メソッドには必ず`public`をつけてください**(`public`をつけずに書くと、コンパイルエラーになります)。
|
||||
|
||||
### 「オーバーロード」と「オーバーライド」は別物です
|
||||
|
||||
名前が似ていて混同しやすいので、ここで整理しておきます。
|
||||
|
||||
* **オーバーロード(Overload)**:同じクラスの中に、同じ名前だけど引数の型や数が違うメソッド(コンストラクタ)を複数作ること。今日の`Book`のコンストラクタが例です。
|
||||
* **オーバーライド(Override)**:親のクラス(`Object`など)がもともと持っているメソッドを、自分のクラスで上書きして中身を変えること。今日の`toString`が例です。
|
||||
|
||||
### `public`をつける習慣について
|
||||
|
||||
コンストラクタ・ゲッター・セッターは、特に指定がない限り`public`で宣言してください。今はすべてのクラスを同じ場所(パッケージ)に置いているので`public`をつけなくても動いてしまいますが、後日パッケージ分けをしたときに「他のクラスから呼び出せない」という問題が起きないよう、今のうちから`public`をつける習慣にしておきましょう。
|
||||
|
||||
## すすめかた
|
||||
|
||||
1. 1段階目から順番に取り組んでください。むずかしそうに見えても、飛ばさないでください。
|
||||
2. 各段階の「お題」をよく読んで、「何を作るのか」を最初に理解してから手を動かしましょう。
|
||||
3. コードが書けたら、必ず実行して**「実行例」と同じ結果になるか**確認しましょう。
|
||||
4. わからない言葉が出てきたら、まず自分で調べてみましょう。調べてもわからないときは、講師に質問してください。
|
||||
5. コピー&ペーストではなく、自分の手で入力して理解しましょう。
|
||||
|
||||
## 提出物
|
||||
|
||||
* 今日修正・作成した`.java`ファイル一式
|
||||
|
||||
---
|
||||
|
||||
## 【基礎確認ゾーン】1〜3段階目
|
||||
|
||||
このゾーンは、CUI_EM_OOPとは直接関係のない練習問題です。1日目に作った`Book`・`Item`・`Student`クラスを、今日習った道具でバージョンアップしながら、基本がしっかり身についているかを確認しましょう。
|
||||
|
||||
### 1段階目(Bookクラスにコンストラクタを作ろう)
|
||||
|
||||
**お題**
|
||||
|
||||
`Book`クラスに、コンストラクタを2つ(オーバーロード)追加してください。コンストラクタは2つとも`public`で宣言してください。
|
||||
|
||||
**<作成フローとポイント>**
|
||||
|
||||
1. `Book.java`に、以下の**引数なしコンストラクタ**を追加してください。
|
||||
* `title`に`"タイトル未設定"`、`author`に`"著者未設定"`、`price`に`0`を代入する
|
||||
2. `Book.java`に、以下の**3つの引数を持つコンストラクタ**を追加してください(1と合わせて2つのコンストラクタになります=コンストラクタのオーバーロード)。
|
||||
* 引数:`String title, String author, int price`
|
||||
* 処理:渡された3つの引数を、それぞれ対応するフィールドに代入する
|
||||
3. `BasicCheck1.java`を修正し、`main`メソッドの中で以下を行ってください。
|
||||
* 引数なしコンストラクタを使って`book1`を作成し、そのまま`title`・`author`・`price`を出力する
|
||||
* 3つの引数を持つコンストラクタを使って、`book2`を`"銀河鉄道の夜"`・`"宮沢賢治"`・`500`で作成し、同様に出力する
|
||||
|
||||
**<実行例>**
|
||||
|
||||
```
|
||||
タイトル未設定
|
||||
著者未設定
|
||||
0
|
||||
銀河鉄道の夜
|
||||
宮沢賢治
|
||||
500
|
||||
```
|
||||
|
||||
### 2段階目(Itemクラスをカプセル化し、toStringをオーバーライドしよう)
|
||||
|
||||
**お題**
|
||||
|
||||
`Item`クラスのフィールドを`private`にして、ゲッター・セッターを作成しましょう。また、`Object`クラスから受け継いでいる`toString`メソッドをオーバーライドしてみましょう。
|
||||
|
||||
**<作成フローとポイント>**
|
||||
|
||||
1. `Item.java`の3つのフィールド(`name`、`price`、`stock`)に、すべて`private`をつけてください。
|
||||
2. 3つのフィールドそれぞれに、ゲッター・セッターを作成してください。
|
||||
* `getName()` / `setName(String name)`
|
||||
* `getPrice()` / `setPrice(int price)`
|
||||
* `getStock()` / `setStock(int stock)`
|
||||
3. `sell`メソッドの中身を、フィールドに直接アクセスする書き方(`this.stock = this.stock - amount;`)から、作成したゲッター・セッターを使う書き方に直してください。
|
||||
* 例:`this.setStock(this.getStock() - amount);`
|
||||
4. `Item.java`に、以下のメソッドを追加してください。
|
||||
* アクセス修飾子:`public`(**必須**です。理由は冒頭の「基本の書き方(文法メモ)」を参照してください)
|
||||
* `@Override`をつける
|
||||
* メソッド名:`toString`
|
||||
* 引数:なし
|
||||
* 戻り値:`String`
|
||||
* 中身:`getName() + " " + getPrice() + "円 (残り" + getStock() + "個)"` のような文字列を`return`する
|
||||
5. `BasicCheck3.java`を修正してください。
|
||||
* `items[i].name = ...`のようにフィールドへ直接代入していた箇所を、すべて`items[i].setName(...)`のようにセッター経由に書き換える
|
||||
* 出力部分を、`System.out.println(items[i]);`のように、**オブジェクトをそのまま渡す形**に書き換える
|
||||
* ※`System.out.println`は、渡されたオブジェクトの`toString`メソッドの戻り値を自動的に出力してくれます。
|
||||
|
||||
**<実行例>**
|
||||
|
||||
```
|
||||
ノート 120円 (残り45個)
|
||||
消しゴム 80円 (残り25個)
|
||||
鉛筆 60円 (残り95個)
|
||||
```
|
||||
|
||||
### 3段階目(Studentクラスにコンストラクタとstaticメンバを追加しよう)
|
||||
|
||||
**お題**
|
||||
|
||||
`Student`クラスにコンストラクタを追加し、「これまで何人の生徒が作られたか」を数える仕組みを`static`で作ってみましょう。
|
||||
|
||||
**<作成フローとポイント>**
|
||||
|
||||
1. `Student.java`に、以下のコンストラクタを追加してください。
|
||||
* 引数:`int studentId, String name`
|
||||
* 処理:渡された引数を、それぞれ対応するフィールドに代入する
|
||||
2. `Student.java`に、以下の`static`フィールドを追加してください。
|
||||
* `static int studentCount = 0;`(生徒が何人作られたかを数えるための、クラス全体で共有するフィールド)
|
||||
3. 2で作ったコンストラクタの中で、`studentCount`を1増やす処理を追加してください(`studentCount++;`)。
|
||||
4. `Student.java`に、以下の`static`メソッドを追加してください。
|
||||
* メソッド名:`getStudentCount`
|
||||
* 引数:なし
|
||||
* 戻り値:`int`
|
||||
* 中身:`studentCount`の値を`return`する
|
||||
5. `BasicCheck2.java`を修正してください。
|
||||
* コンストラクタを使って、`student1`(`1`, `"鈴木一郎"`)、`student2`(`2`, `"田中花子"`)、`student3`(`3`, `"佐藤次郎"`)の3人分のインスタンスを作成する
|
||||
* それぞれの`printProfile`メソッドを呼び出す
|
||||
* 最後に、`Student.getStudentCount()`のように**インスタンスではなくクラス名から直接**呼び出し、結果を`"現在の生徒数:" + 件数 + "人"`という形式で出力する
|
||||
|
||||
**<考え方のヒント>**
|
||||
|
||||
* `static`がついたフィールドやメソッドは、`this.name`のような個々のインスタンスが持つデータとは違い、**そのクラス全体で1つだけ共有される**データです。だからこそ、インスタンスを経由せず`Student.getStudentCount()`のようにクラス名から直接呼び出せます。
|
||||
|
||||
**<実行例>**
|
||||
|
||||
```
|
||||
学籍番号:1 名前:鈴木一郎
|
||||
学籍番号:2 名前:田中花子
|
||||
学籍番号:3 名前:佐藤次郎
|
||||
現在の生徒数:3人
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 【CUI_EM_OOP制作ゾーン】4〜6段階目
|
||||
|
||||
ここからは、1日目に作った`EmployeeData`・`Main`を、今日習った道具でバージョンアップし、完成形の姿にぐっと近づけていきます。
|
||||
|
||||
### 4段階目(EmployeeDataをカプセル化しよう)
|
||||
|
||||
**お題**
|
||||
|
||||
`EmployeeData`クラスの6つのフィールドを`private`にして、ゲッター・セッターを作成しましょう。
|
||||
|
||||
**<作成フローとポイント>**
|
||||
|
||||
1. `EmployeeData.java`の6つのフィールドすべてに、`private`をつけてください。
|
||||
2. 6つのフィールドそれぞれに、以下の名前でゲッター・セッターを作成してください(今後も同じ名前を使い続けるので、統一しておきましょう。すべて`public`で宣言してください)。
|
||||
* `getIdEmployee()` / `setIdEmployee(String idEmployee)`
|
||||
* `getNmEmployee()` / `setNmEmployee(String nmEmployee)`
|
||||
* `getKnEmployee()` / `setKnEmployee(String knEmployee)`
|
||||
* `getMailAddress()` / `setMailAddress(String mailAddress)`
|
||||
* `getPassword()` / `setPassword(String password)`
|
||||
* `getIdDepartment()` / `setIdDepartment(String idDepartment)`
|
||||
3. `showInfo`メソッドの中身を、フィールドに直接アクセスする書き方(`this.idEmployee`など)から、1で作ったゲッターを使う書き方に直してください。
|
||||
4. `Main.java`を見直し、`employee.idEmployee = "10000";`のようにフィールドへ直接代入している箇所を、**すべて**`employee.setIdEmployee("10000");`のようにセッター経由の書き方に直してください。
|
||||
* 4〜6段階目だけでなく、7〜9段階目(検索機能)で作った箇所も含めて、すべて探して直しましょう。
|
||||
|
||||
**<実行例>**
|
||||
|
||||
これまでと同じ表示になります(6段階目・9段階目の実行例と見比べて確認してください)。
|
||||
|
||||
### 5段階目(EmployeeDataにコンストラクタを作ろう)
|
||||
|
||||
**お題**
|
||||
|
||||
`EmployeeData`クラスに、コンストラクタを2つ(オーバーロード)追加しましょう。
|
||||
|
||||
**<作成フローとポイント>**
|
||||
|
||||
1. `EmployeeData.java`に、**引数なしコンストラクタ**を追加してください。
|
||||
* 中身は空のままでOKです(何もしなくて構いません)。
|
||||
2. `EmployeeData.java`に、**6つの引数を持つコンストラクタ**を追加してください(1と合わせてオーバーロードになります)。
|
||||
* 引数:`String idEmployee, String nmEmployee, String knEmployee, String mailAddress, String password, String idDepartment`
|
||||
* 処理:渡された6つの引数を、直接フィールドに代入するのではなく、対応する**セッターを呼び出して**設定する
|
||||
* 例:`this.setIdEmployee(idEmployee);`
|
||||
3. `Main.java`の4段階目で作った「1件分の社員データを作る部分」を、新しく作った6引数コンストラクタを使う形に書き換えてください。
|
||||
* 例:`EmployeeData employee = new EmployeeData("10000", "山田龍也", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10");`
|
||||
4. 6段階目(5人分)・7〜9段階目(検索機能)で社員データを作っている部分は、これまで通り「引数なしコンストラクタ+セッター」の形のままで構いません。
|
||||
|
||||
> **補足**:CSVファイルのようなデータを1項目ずつ読み込んで詰め替えていく場面では、あえて「引数なしコンストラクタ+セッター」の組み合わせが使われることもよくあります(このシステムでも、後日ファイルを扱うミッションでそのような作り方が登場します)。今回作った6引数コンストラクタは、実務でもよく使われる便利な書き方ですが、「どちらが正しい」ということではなく、状況に応じて使い分けるものだと覚えておいてください。
|
||||
|
||||
**<実行例>**
|
||||
|
||||
これまでと表示内容は変わりません。
|
||||
|
||||
### 6段階目(toStringをオーバーライドしよう)
|
||||
|
||||
**お題**
|
||||
|
||||
`showInfo`メソッドを、`Object`クラスの`toString`メソッドをオーバーライドする形に作り直しましょう。
|
||||
|
||||
**<作成フローとポイント>**
|
||||
|
||||
1. `EmployeeData.java`の`showInfo`メソッドを、以下のルールで書き換えてください。
|
||||
* メソッド名を`showInfo`から`toString`に変える
|
||||
* アクセス修飾子を`public`にする(`showInfo`は修飾子なしでしたが、`toString`は`Object`クラスの`public`なメソッドをオーバーライドするため`public`が**必須**です。つけないとコンパイルエラーになります)
|
||||
* メソッドの前に`@Override`をつける
|
||||
* 戻り値を`void`から`String`に変える
|
||||
* 中で`System.out.println`していた部分はやめて、その文字列を`return`するようにする
|
||||
2. `Main.java`の中で、`employee.showInfo();`や`employees[i].showInfo();`のように呼び出していた箇所を、**すべて**`System.out.println(employee);`・`System.out.println(employees[i]);`のように、オブジェクトをそのまま渡す形に書き換えてください。
|
||||
3. 7〜9段階目(検索機能)の中で`showInfo()`を呼んでいた箇所も、同様に書き換えてください。
|
||||
|
||||
**<実行例>**
|
||||
|
||||
1日目の6段階目・9段階目とまったく同じ表示になることを確認してください。
|
||||
|
||||
```
|
||||
10000 山田龍也 ヤマダタツヤ yamada@hoge.jp aaa 10
|
||||
10001 高橋準 タカハシジュン jtaka@hoge.jp bbb 10
|
||||
10002 麻枝史明 マエダフミアキ fmak@hoge.jp ccc 11
|
||||
10003 丸戸章介 マルトショウスケ marusyo@hoge.jp ddd 12
|
||||
10004 三宅武 ミヤケタケシ miya@hoge.jp eee 13
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 【挑戦問題ゾーン】7〜9段階目
|
||||
|
||||
ここからは応用問題です。今日習った内容に加えて、自分で少し調べながら進める部分があります。難しく感じても焦らず、じっくり調べながら取り組んでみましょう(経験者の方でも、多少時間がかかる内容です)。
|
||||
|
||||
### 7段階目(staticで社員データの件数を数えよう)
|
||||
|
||||
**お題**
|
||||
|
||||
`EmployeeData`クラスに、これまで何件のインスタンスが作られたかを数える仕組みを追加してください。
|
||||
|
||||
**<お題の条件>**
|
||||
|
||||
* `private static int empCount = 0;`のような`static`フィールドを追加する
|
||||
* 2つのコンストラクタ(引数なし・6引数)の**両方**の中で、`empCount`を1増やす処理を追加する
|
||||
* `static int getEmpCount()`のような`static`メソッドを追加し、`empCount`の値を返せるようにする
|
||||
* `Main.java`で、6段階目の5人分のインスタンスをすべて生成し終えたあとに、`EmployeeData.getEmpCount()`のように**クラス名から直接**呼び出し、作られた件数を出力する
|
||||
|
||||
**<考え方のヒント>**
|
||||
|
||||
* `static`がついたフィールドやメソッドは、個々の社員データ(`idEmployee`など)とは違い、「全員で1つを共有する」データです。コンストラクタが呼ばれるたびに増える、という点を意識してみましょう。
|
||||
|
||||
**<余裕がある人向け(任意)>**
|
||||
|
||||
`static final`をつけると、あとから値を変更できない「定数」を作ることができます。試しに`EmployeeData`クラスに`static final String COMPANY_NAME = "Rhizome";`のような定数を追加し、どこかで出力してみましょう。今回のシステムでは必須ではありませんが、後日のミッションでよく使う書き方です。
|
||||
|
||||
**<実行例>**
|
||||
|
||||
```
|
||||
10000 山田龍也 ヤマダタツヤ yamada@hoge.jp aaa 10
|
||||
10001 高橋準 タカハシジュン jtaka@hoge.jp bbb 10
|
||||
10002 麻枝史明 マエダフミアキ fmak@hoge.jp ccc 11
|
||||
10003 丸戸章介 マルトショウスケ marusyo@hoge.jp ddd 12
|
||||
10004 三宅武 ミヤケタケシ miya@hoge.jp eee 13
|
||||
現在の社員データ件数:5件
|
||||
```
|
||||
|
||||
### 8段階目(セッターに簡単なチェックを入れてみよう)
|
||||
|
||||
**お題**
|
||||
|
||||
今の`setNmEmployee`は、どんな値を渡されてもそのまま代入してしまいます。空文字や空白だけの値が渡された場合は代入しないように直してみましょう。
|
||||
|
||||
**<お題の条件>**
|
||||
|
||||
* `setNmEmployee`の引数`nmEmployee`が、`null`、または前後の空白を取り除いた結果が空文字になる場合、「社員名が空のため設定できませんでした」と表示し、**フィールドへの代入を行わない**
|
||||
* それ以外の場合は、これまで通りフィールドに代入する
|
||||
|
||||
**<考え方のヒント>**
|
||||
|
||||
* 文字列の前後の空白を取り除くメソッドと、文字列の長さ(または空文字かどうか)を調べるメソッドを、それぞれ調べてみましょう。
|
||||
* `null`かどうかを確認する条件を、他の条件より**先に**書かないと、`null`の状態で文字列用のメソッドを呼び出そうとして`NullPointerException`というエラーで止まってしまいます。条件を書く順番に気をつけましょう。
|
||||
|
||||
**<実行例>**(`Main.java`で試しに空文字を`setNmEmployee`に渡してみた場合)
|
||||
|
||||
```
|
||||
社員名が空のため設定できませんでした
|
||||
```
|
||||
|
||||
### 9段階目(チェックをもう1つの項目にも広げ、コンストラクタと統一しよう)
|
||||
|
||||
**お題**
|
||||
|
||||
8段階目で作った「空文字チェック」の考え方を、`idEmployee`(社員ID)にも広げましょう。また、コンストラクタが本当にセッター経由になっているかを見直し、統一します。
|
||||
|
||||
**<お題の条件>**
|
||||
|
||||
1. `setIdEmployee`メソッドにも、8段階目の`setNmEmployee`と同じような空文字チェックを追加してください。
|
||||
* `idEmployee`が`null`、または前後の空白を取り除いた結果が空文字になる場合、「社員IDが空のため設定できませんでした」と表示し、フィールドへの代入を行わない
|
||||
* それ以外の場合は、これまで通りフィールドに代入する
|
||||
2. 8段階目で作ったチェックは、セッターを直接呼び出したときにしか働きません。5段階目で作った6引数コンストラクタの中身を見直し、**6つのフィールドすべてが、直接代入ではなくセッターを呼び出す形**(`this.setNmEmployee(nmEmployee);`のような形)になっているか確認してください。
|
||||
* もし直接代入の書き方(`this.nmEmployee = nmEmployee;`など)が残っていた場合は、すべてセッターを呼び出す形に書き換えてください。
|
||||
|
||||
**<確認方法>**
|
||||
|
||||
`Main.java`で、6引数コンストラクタの`nmEmployee`引数に空文字`""`を渡して`EmployeeData`を生成してみましょう。「社員名が空のため設定できませんでした」と表示され、生成されたインスタンスの`nmEmployee`が設定されない(`null`のままになる)ことを確認してください。同様に、`idEmployee`引数を空文字にした場合も「社員IDが空のため設定できませんでした」と表示されることを確認してください。
|
||||
|
||||
**<実行例>**
|
||||
|
||||
```
|
||||
社員名が空のため設定できませんでした
|
||||
社員IDが空のため設定できませんでした
|
||||
```
|
||||
|
||||
> **ポイント**:「値のチェックはセッターに1回だけ書き、コンストラクタも含めて全員がセッター経由で値を設定する」という作りは、実務でもよく使われる、堅牢なクラス設計の基本パターンです。
|
||||
|
||||
---
|
||||
|
||||
## まとめ
|
||||
|
||||
今日は「コンストラクタ」「アクセス修飾子」「ゲッター・セッター」「メソッドのオーバーライド」「`static`」という道具を使って、1日目に作った土台を大きくバージョンアップしました。特に`EmployeeData`クラスは、フィールドが`private`で守られ、コンストラクタとゲッター・セッターを備え、`toString`で自分の情報を表現できる、完成形にかなり近い姿になりました。
|
||||
|
||||
今日書いたコードも消さずに残しておいてください。次回以降のミッションで、継承・多態性・コレクション・例外処理・ファイル入出力などを習いながら、最終的に本物の「社員メンテナンス(ファイルシステム版)」システムに近づけていきます。
|
||||
@@ -1,7 +0,0 @@
|
||||
|
||||
public abstract class BaseDate {
|
||||
public abstract String toString();
|
||||
public abstract String toCSV();
|
||||
public abstract String getPrimaryKeyValue();
|
||||
|
||||
}
|
||||
@@ -3,15 +3,27 @@ public class BasicCheck1 {
|
||||
|
||||
public static void main(String[] args) {
|
||||
// TODO 自動生成されたメソッド・スタブ
|
||||
Book book = new Book();
|
||||
book.title = "吾輩は猫である";
|
||||
book.author = "夏目漱石";
|
||||
book.price = 800;
|
||||
System.out.println(book.title);
|
||||
System.out.println(book.author);
|
||||
System.out.println(book.price);
|
||||
|
||||
System.out.println();
|
||||
|
||||
//9/15段階1
|
||||
Book book1 = new Book();
|
||||
System.out.println(book1.title);
|
||||
System.out.println(book1.author);
|
||||
System.out.println(book1.price);
|
||||
|
||||
Book book2 = new Book("銀河鉄道の夜","宮沢賢治",500);
|
||||
Book book2 = new Book("銀河鉄道の夜", "宮沢賢治", 500);
|
||||
System.out.println(book2.title);
|
||||
System.out.println(book2.author);
|
||||
System.out.println(book2.price);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,15 +3,13 @@ public class BasicCheck2 {
|
||||
|
||||
public static void main(String[] args) {
|
||||
// TODO 自動生成されたメソッド・スタブ
|
||||
Student student1 = new Student(1,"鈴木一郎");
|
||||
Student student2 = new Student(2,"田中花子");
|
||||
Student student3 = new Student(3,"佐藤次郎");
|
||||
Student student1 = new Student(1, "鈴木一郎");
|
||||
Student student2 = new Student(2, "田中花子");
|
||||
Student student3 = new Student(3, "佐藤次郎");
|
||||
student1.printProfile();
|
||||
student2.printProfile();
|
||||
student3.printProfile();
|
||||
int total=Student.getStudentCount();
|
||||
System.out.println("現在の生徒数" + total + "人");
|
||||
System.out.println("現在の生徒数:" + Student.getStudentCount() + "人");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -2,27 +2,25 @@
|
||||
public class BasicCheck3 {
|
||||
|
||||
public static void main(String[] args) {
|
||||
// 配列
|
||||
// TODO 自動生成されたメソッド・スタブ
|
||||
Item[] items = new Item[3];
|
||||
items[0] = new Item();
|
||||
items[1] = new Item();
|
||||
items[2] = new Item();
|
||||
//items[0]代入
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
items[i] = new Item();
|
||||
}
|
||||
items[0].setName("ノート");
|
||||
items[0].setPrice(120);
|
||||
items[0].setStock (50);
|
||||
//items[1]代入
|
||||
items[0].setStock(50);
|
||||
items[1].setName("消しゴム");
|
||||
items[1].setPrice(80);
|
||||
items[1].setStock(30);
|
||||
//items[2]代入
|
||||
items[2].setName("鉛筆");
|
||||
items[2].setPrice(60);
|
||||
items[2].setStock(100);
|
||||
for (int i=0; i<=2; i++) {
|
||||
items[i].sell(5);
|
||||
System.out.println(items[i]);
|
||||
}
|
||||
|
||||
for (Item i : items) {
|
||||
i.sell(5);
|
||||
System.out.println(i);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,13 +4,15 @@ public class Book {
|
||||
String author;
|
||||
int price;
|
||||
|
||||
public Book () {
|
||||
//コンストラクタ
|
||||
public Book() {
|
||||
title = "タイトル未設定";
|
||||
author = "著者未設定";
|
||||
price = 0;
|
||||
}
|
||||
|
||||
public Book(String title,String author,int price) {
|
||||
//引数ありコンストラクタ
|
||||
public Book(String title, String author, int price) {
|
||||
this.title = title;
|
||||
this.author = author;
|
||||
this.price = price;
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
|
||||
public class Circle extends Shape {
|
||||
private double radius;
|
||||
|
||||
public Circle(double radius) {
|
||||
super("円");
|
||||
this.radius = radius;
|
||||
}
|
||||
@Override
|
||||
public double area() {
|
||||
double num;
|
||||
num = Math.PI * radius * radius;
|
||||
return num;
|
||||
}
|
||||
@Override
|
||||
public void showInfo() {
|
||||
super.showInfo();
|
||||
System.out.println("(半径:" + this.radius + ")");
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
public class Day3Check1 {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Circle circle = new Circle(2);
|
||||
circle.showInfo();
|
||||
Rectangle rectangle = new Rectangle(3,4);
|
||||
rectangle.showInfo();
|
||||
|
||||
Greeting greeting = new JapaneseGreeting();
|
||||
System.out.println(greeting.hello());
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
|
||||
public class Day3Check3 {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Shape shape1 = new Circle(2);
|
||||
shape1.showInfo();
|
||||
Shape shape2 = new Rectangle(3, 4);
|
||||
shape2.showInfo();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
|
||||
public class DepartmentDate extends BaseDate {
|
||||
private String idDepartment;
|
||||
private String nmDepartment;
|
||||
|
||||
|
||||
public String getIdDepartment() {
|
||||
return idDepartment;
|
||||
}
|
||||
|
||||
public void setIdDepartment(String idDepartment) {
|
||||
this.idDepartment = idDepartment;
|
||||
}
|
||||
|
||||
public String getNmDepartment() {
|
||||
return nmDepartment;
|
||||
}
|
||||
|
||||
public void setNmDepartment(String nmDepartment) {
|
||||
this.nmDepartment = nmDepartment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String str1 = (getIdDepartment() + "\t" + getNmDepartment());
|
||||
return str1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toCSV() {
|
||||
String str2 = (getIdDepartment() + "," + getNmDepartment());
|
||||
return str2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrimaryKeyValue() {
|
||||
String str3 = (getIdDepartment());
|
||||
return str3;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,17 +1,60 @@
|
||||
|
||||
public class EmployeeData extends BaseDate {
|
||||
public class EmployeeData {
|
||||
private String idEmployee;
|
||||
private String nmEmployee;
|
||||
private String knEmployee;
|
||||
private String mailAddress;
|
||||
private String password;
|
||||
private String idDepartment;
|
||||
private static int empCount = 0;
|
||||
static final String COMPANY_NAME = "Rhizome";
|
||||
|
||||
//コンストラクタ
|
||||
public EmployeeData() {
|
||||
empCount++;
|
||||
}
|
||||
|
||||
//引数ありコンストラクタ
|
||||
public EmployeeData(String idEmployee, String nmEmployee, String knEmployee,
|
||||
String mailAddress, String password, String idDepartment) {
|
||||
this.setIdEmployee(idEmployee);
|
||||
this.setNmEmployee(nmEmployee);
|
||||
this.setKnEmployee(knEmployee);
|
||||
this.setMailAddress(mailAddress);
|
||||
this.setPassword(password);
|
||||
this.setIdDepartment(idDepartment);
|
||||
|
||||
empCount++;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.idEmployee + "\t" + this.nmEmployee
|
||||
+ "\t" + this.knEmployee + "\t" + this.mailAddress
|
||||
+ "\t" + this.password + "\t" + this.idDepartment;
|
||||
}
|
||||
|
||||
public boolean isMatchId(String id) {
|
||||
return getIdEmployee().equals(id);
|
||||
}
|
||||
|
||||
public static boolean isMatchId(EmployeeData[] employees, String id) {
|
||||
for (EmployeeData e : employees) {
|
||||
if (e.isMatchId(id))
|
||||
return true;
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public String getIdEmployee() {
|
||||
return idEmployee;
|
||||
}
|
||||
|
||||
public void setIdEmployee(String idEmployee) {
|
||||
if (!check(idEmployee, "社員ID"))
|
||||
return;
|
||||
this.idEmployee = idEmployee;
|
||||
}
|
||||
|
||||
@@ -20,8 +63,10 @@ public class EmployeeData extends BaseDate {
|
||||
}
|
||||
|
||||
public void setNmEmployee(String nmEmployee) {
|
||||
if (!check(nmEmployee, "社員名"))
|
||||
return;
|
||||
this.nmEmployee = nmEmployee;
|
||||
}
|
||||
}
|
||||
|
||||
public String getKnEmployee() {
|
||||
return knEmployee;
|
||||
@@ -55,64 +100,16 @@ public class EmployeeData extends BaseDate {
|
||||
this.idDepartment = idDepartment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String str;
|
||||
str = (getIdEmployee() + "\t" + getNmEmployee() + "\t" + getKnEmployee() + "\t" + getMailAddress()
|
||||
+ "\t" + getPassword() + "\t" + getIdDepartment());
|
||||
return str;
|
||||
public static int getEmpCount() {
|
||||
return empCount;
|
||||
}
|
||||
|
||||
private static int empCount = 0;
|
||||
|
||||
public EmployeeData() {
|
||||
empCount++;
|
||||
}
|
||||
//
|
||||
public EmployeeData(String idEmployee, String nmEmployee, String knEmployee, String mailAddress, String password,
|
||||
String idDepartment) {
|
||||
idEmployee = idEmployee.trim();
|
||||
int in =idEmployee.length();
|
||||
if (in==0) {
|
||||
nmEmployee ="社員IDが空のため設定できませんでした";
|
||||
}
|
||||
this.setIdEmployee(idEmployee);
|
||||
nmEmployee = nmEmployee.trim();
|
||||
int i =nmEmployee.length();
|
||||
if (i==0) {
|
||||
nmEmployee ="社員名がからのため設定できませんでした";
|
||||
}
|
||||
this.setNmEmployee(nmEmployee);
|
||||
this.setKnEmployee(knEmployee);
|
||||
this.setMailAddress(mailAddress);
|
||||
this.setPassword(password);
|
||||
this.setIdDepartment(idDepartment);
|
||||
empCount++;
|
||||
}
|
||||
static int getEmpCount() {
|
||||
int result = empCount;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toCSV() {
|
||||
String str;
|
||||
str = (getIdEmployee() + "," + getNmEmployee() + "," + getKnEmployee() + "," + getMailAddress()
|
||||
+ "," + getPassword() + "," + getIdDepartment());
|
||||
return str;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrimaryKeyValue() {
|
||||
return idEmployee;
|
||||
}
|
||||
public boolean isMatchId(String id) {
|
||||
// System.out.println(id + "を検索します");
|
||||
if(id.equals(idEmployee)) {
|
||||
return true;
|
||||
} else {
|
||||
private boolean check(String str, String stringName) {
|
||||
if (str == null || str.strip().length() == 0) {
|
||||
System.out.println(stringName + "が空のため設定できませんでした");
|
||||
return false;
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
public interface Greeting {
|
||||
String hello();
|
||||
}
|
||||
@@ -4,6 +4,19 @@ public class Item {
|
||||
private int price;
|
||||
private int stock;
|
||||
|
||||
void sell(int amount) {
|
||||
this.setStock(this.getStock() - amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.getName() + " " + this.getPrice() + "円(残り" + this.getStock() + "個)";
|
||||
}
|
||||
|
||||
int totalPrice() {
|
||||
return this.price * this.stock;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
@@ -27,13 +40,4 @@ public class Item {
|
||||
public void setStock(int stock) {
|
||||
this.stock = stock;
|
||||
}
|
||||
|
||||
void sell(int amount) {
|
||||
this.setStock(this.getStock() - amount);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
String str = getName() + " " + getPrice() + "円 (残り" + getStock() + "個)";
|
||||
return str;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
|
||||
public class JapaneseGreeting implements Greeting {
|
||||
@Override
|
||||
public String hello() {
|
||||
String str =("こんにちは");
|
||||
return str;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,184 +1,121 @@
|
||||
import java.util.ArrayList;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
ArrayList<EmployeeData> list = new ArrayList<>();
|
||||
list.add(new EmployeeData("10000", "山田龍也", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10"));
|
||||
list.add(new EmployeeData("10001", "高橋準", "タカハシジュン", "jtaka@hoge.jp", "bbb", "11"));
|
||||
list.add(new EmployeeData("10002", "麻枝史明", "マエダフミアキ", "fmak@hoge.jp", "ccc", "12"));
|
||||
list.add(new EmployeeData("10003", "丸戸章介", "マルトショウスケ", "marusyo@hoge.jp", "ddd", "13"));
|
||||
list.add(new EmployeeData("10004", "三宅武", "ミヤケタケシ", "miya@hoge.jp", "eee", "14"));
|
||||
// list.add("10 役員");
|
||||
// list.add("11 人事・総務部");
|
||||
// list.add("12 経理部");
|
||||
// list.add("13 システム開発事業部");
|
||||
// list.add("14 教育事業部");
|
||||
// list.add("15 営業企画部");
|
||||
System.out.println("会社名:" + EmployeeData.COMPANY_NAME);
|
||||
|
||||
String str1 = (" ");
|
||||
while (!str1.equals("0")) {
|
||||
System.out.println("1:検索 2:登録 3:更新: 4:削除 0:終了");
|
||||
Scanner sc1 = new Scanner(System.in);
|
||||
str1 = sc1.nextLine();
|
||||
System.out.println(str1);
|
||||
if (str1.equals("1")) {
|
||||
System.out.println("1:全検索 2:条件検索 それ以外:戻る");
|
||||
Scanner sc2 = new Scanner(System.in);
|
||||
String str2 = sc2.nextLine();
|
||||
System.out.println(str2);
|
||||
if (str2.equals("1")) {
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
System.out.println(list.get(i));
|
||||
}
|
||||
} else if (str2.equals("2")) {
|
||||
System.out.println("検索したい社員IDを入力してください");
|
||||
Scanner sc3 = new Scanner(System.in);
|
||||
String str3 = sc3.nextLine();
|
||||
for (int j = 0; j < list.size(); j++) {
|
||||
if (list.get(j).getIdEmployee().equals(str3)) {
|
||||
System.out.println(list.get(j));
|
||||
break;
|
||||
} else if (!list.get(j).getIdEmployee().equals(str3) && j == list.size()) {
|
||||
System.out.println("入力された値で情報が見つかりませんでした");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (str1.equals("2")) {
|
||||
System.out.println("社員IDを入力してください");
|
||||
Scanner sc4 = new Scanner(System.in);
|
||||
String str4 = sc4.nextLine();
|
||||
System.out.println(str4);
|
||||
System.out.println("社員名を入力してください");
|
||||
Scanner sc5 = new Scanner(System.in);
|
||||
String str5 = sc5.nextLine();
|
||||
System.out.println(str5);
|
||||
System.out.println("フリガナを入力してください");
|
||||
Scanner sc6 = new Scanner(System.in);
|
||||
String str6 = sc6.nextLine();
|
||||
System.out.println(str6);
|
||||
System.out.println("メールアドレスを入力してください");
|
||||
Scanner sc7 = new Scanner(System.in);
|
||||
String str7 = sc7.nextLine();
|
||||
System.out.println(str7);
|
||||
System.out.println("パスワードを入力してください");
|
||||
Scanner sc8 = new Scanner(System.in);
|
||||
String str8 = sc8.nextLine();
|
||||
System.out.println(str8);
|
||||
System.out.println("部署IDを入力してください");
|
||||
Scanner sc9 = new Scanner(System.in);
|
||||
String str9 = sc9.nextLine();
|
||||
System.out.println(str9);
|
||||
System.out.println("登録が完了しました");
|
||||
list.add(new EmployeeData(str4, str5, str6, str7, str8, str9));
|
||||
// EmployeeData employee = new EmployeeData("10000", "山田龍也", "ヤマダタツヤ",
|
||||
// "yamada@hoge.jp", "aaa", "10");
|
||||
// System.out.println(employee);
|
||||
//
|
||||
// System.out.println();
|
||||
|
||||
} else if (str1.equals("3")) {
|
||||
System.out.println("社員IDを入力してください");
|
||||
Scanner sc4 = new Scanner(System.in);
|
||||
String str4 = sc4.nextLine();
|
||||
for (int k = 0; k < list.size(); k++) {
|
||||
if (list.get(k).getIdEmployee().equals(str4)) {
|
||||
System.out.println(str4);
|
||||
System.out.println("社員名を入力してください");
|
||||
Scanner sc5 = new Scanner(System.in);
|
||||
String str5 = sc5.nextLine();
|
||||
System.out.println(str5);
|
||||
System.out.println("フリガナを入力してください");
|
||||
Scanner sc6 = new Scanner(System.in);
|
||||
String str6 = sc6.nextLine();
|
||||
System.out.println(str6);
|
||||
System.out.println("メールアドレスを入力してください");
|
||||
Scanner sc7 = new Scanner(System.in);
|
||||
String str7 = sc7.nextLine();
|
||||
System.out.println(str7);
|
||||
System.out.println("パスワードを入力してください");
|
||||
Scanner sc8 = new Scanner(System.in);
|
||||
String str8 = sc8.nextLine();
|
||||
System.out.println(str8);
|
||||
System.out.println("部署IDを入力してください");
|
||||
Scanner sc9 = new Scanner(System.in);
|
||||
String str9 = sc9.nextLine();
|
||||
System.out.println(str9);
|
||||
System.out.println("更新が完了しました");
|
||||
list.set(k, new EmployeeData(str4, str5, str6, str7, str8, str9));
|
||||
break;
|
||||
} else if (!list.get(k).getIdEmployee().equals(str4) && k == list.size()) {
|
||||
System.out.println("入力された値で情報が見つかりませんでした");
|
||||
}
|
||||
}
|
||||
} else if (str1.equals("4")) {
|
||||
System.out.println("削除するIDを入力してください");
|
||||
Scanner sc4 = new Scanner(System.in);
|
||||
String str4 = sc4.nextLine();
|
||||
for (int l = 0; l < list.size(); l++) {
|
||||
if (list.get(l).getIdEmployee().equals(str4)) {
|
||||
System.out.println("指定されたIDの情報を削除します? y/Y");
|
||||
System.out.println("y/Y以外の入力であればキャンセル");
|
||||
Scanner sc5 = new Scanner(System.in);
|
||||
String str5 = sc5.nextLine();
|
||||
System.out.println(str5);
|
||||
if (str5.equals("y") || str5.equals("Y")) {
|
||||
list.remove(l);
|
||||
System.out.println("削除されました");
|
||||
break;
|
||||
} else {
|
||||
System.out.println("入力された値で情報が見つかりませんでした");
|
||||
}
|
||||
}
|
||||
EmployeeData[] employees = new EmployeeData[5];
|
||||
for (int i = 0; i < employees.length; i++) {
|
||||
employees[i] = new EmployeeData();
|
||||
}
|
||||
|
||||
employees[0].setIdEmployee("10000");
|
||||
employees[0].setNmEmployee("山田龍也");
|
||||
employees[0].setKnEmployee("ヤマダタツヤ");
|
||||
employees[0].setMailAddress("yamada@hoge.jp");
|
||||
employees[0].setPassword("aaa");
|
||||
employees[0].setIdDepartment("10");
|
||||
|
||||
employees[1].setIdEmployee("10001");
|
||||
employees[1].setNmEmployee("高橋準\t");
|
||||
employees[1].setKnEmployee("タカハシジュン");
|
||||
employees[1].setMailAddress("jtaka@hoge.jp");
|
||||
employees[1].setPassword("bbb");
|
||||
employees[1].setIdDepartment("10");
|
||||
|
||||
employees[2].setIdEmployee("10002");
|
||||
employees[2].setNmEmployee("麻枝史明");
|
||||
employees[2].setKnEmployee("マエダフミアキ");
|
||||
employees[2].setMailAddress("fmak@hoge.jp");
|
||||
employees[2].setPassword("ccc");
|
||||
employees[2].setIdDepartment("11");
|
||||
|
||||
employees[3].setIdEmployee("10003");
|
||||
employees[3].setNmEmployee("丸戸章介");
|
||||
employees[3].setKnEmployee("マルトショウスケ");
|
||||
employees[3].setMailAddress("marusyo@hoge.jp");
|
||||
employees[3].setPassword("ddd");
|
||||
employees[3].setIdDepartment("12");
|
||||
|
||||
employees[4].setIdEmployee("10004");
|
||||
employees[4].setNmEmployee("三宅武\t");
|
||||
employees[4].setKnEmployee("ミヤケタケシ");
|
||||
employees[4].setMailAddress("miya@hoge.jp");
|
||||
employees[4].setPassword("eee");
|
||||
employees[4].setIdDepartment("13");
|
||||
|
||||
for (EmployeeData e : employees) {
|
||||
System.out.println(e);
|
||||
;
|
||||
}
|
||||
System.out.println("現在の社員のデータ件数:" + EmployeeData.getEmpCount() + "件");
|
||||
|
||||
System.out.println();
|
||||
|
||||
//nullおよび前後の空白を取り除いた結果が空文字チェック
|
||||
EmployeeData emp = new EmployeeData("10000", "デフォルト", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10");
|
||||
System.out.println(emp);
|
||||
emp.setNmEmployee(null);
|
||||
System.out.println(emp);
|
||||
emp.setNmEmployee(" ");
|
||||
System.out.println(emp);
|
||||
|
||||
System.out.println();
|
||||
|
||||
EmployeeData emptyEmployee = new EmployeeData("", "", "", "", "", "");
|
||||
System.out.println(emptyEmployee);
|
||||
|
||||
System.out.println();
|
||||
|
||||
//IDが一致するか
|
||||
boolean matchIdBool = false;
|
||||
System.out.println("10002 を検索します");
|
||||
for (EmployeeData e : employees) {
|
||||
matchIdBool = e.isMatchId("10002");
|
||||
if (matchIdBool)
|
||||
break;
|
||||
}
|
||||
System.out.println(matchIdBool);
|
||||
|
||||
System.out.println("99999 を検索します");
|
||||
System.out.println(EmployeeData.isMatchId(employees, "99999"));
|
||||
|
||||
System.out.println("10003 を検索します");
|
||||
System.out.println(EmployeeData.isMatchId(employees, "10003"));
|
||||
|
||||
System.out.println();
|
||||
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
while (true) {
|
||||
System.out.println("検索したい社員IDを入力してください(終了する場合は0)");
|
||||
System.out.print(">>>>");
|
||||
String findId = scanner.nextLine();
|
||||
if (findId.equals("0")) {
|
||||
System.out.println("システムを終了します");
|
||||
return;
|
||||
}
|
||||
|
||||
boolean matchFlag = false;
|
||||
|
||||
for (EmployeeData e : employees) {
|
||||
if (e.isMatchId(findId)) {
|
||||
System.out.println(e);
|
||||
matchFlag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!matchFlag) {
|
||||
System.out.println("該当する社員が見つかりませんでした");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
System.out.println("システムを終了します");
|
||||
// num1 = 0;
|
||||
// int num2 = 0;
|
||||
// for (int i = 0; i <= 10; i++) {
|
||||
// if (alldate[i] instanceof EmployeeData) {
|
||||
// num1++;
|
||||
// EmployeeData emp = (EmployeeData) alldate[i];
|
||||
// System.out.println(emp.getMailAddress());
|
||||
// } else {
|
||||
// num2++;
|
||||
// System.out.println(alldate[i]);
|
||||
// }
|
||||
// }
|
||||
// System.out.println("社員データ:" + num1 + "件");
|
||||
// System.out.println("部署データ" + num2 + "件");
|
||||
// int j = EmployeeData.getEmpCount();
|
||||
// System.out.println("現在の社員データ件数;" + j + "件");
|
||||
// String id = ("");
|
||||
// for (int k = 0; k <= 10; k++) {
|
||||
// if (alldate[k] instanceof DepartmentDate) {
|
||||
// DepartmentDate dep = (DepartmentDate) alldate[k];
|
||||
// if (dep.getNmDepartment().equals("システム開発事業部")) {
|
||||
// id = dep.getIdDepartment();
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// for (int l = 0; l < 10; l++) {
|
||||
// if (alldate[l] instanceof EmployeeData) {
|
||||
// EmployeeData emp = (EmployeeData) alldate[l];
|
||||
// if (emp.getIdDepartment().equals(id)) {
|
||||
// System.out.println(emp.getNmEmployee() + " " + emp.getMailAddress());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// System.out.println(employee[0].toCSV());
|
||||
// System.out.println(employee[0].getPrimaryKeyValue());
|
||||
// String str = "";
|
||||
// while (!str.equals("0")) {
|
||||
// System.out.println("検索したい社員IDを入力してください(終了する場合は0)");
|
||||
// Scanner sc3 = new Scanner(System.in);
|
||||
// str = sc.nextLine();
|
||||
// for (int m = 0; m <= 4; m++) {
|
||||
// if (employee[m].getPrimaryKeyValue().equals(str)) {
|
||||
// System.out.println(employee[m]);
|
||||
// break;
|
||||
// } else if (!employee[m].getPrimaryKeyValue().equals(str) && m == 4 && !str.equals("0")) {
|
||||
// System.out.println("該当する社員が見つかりませんでした");
|
||||
// }
|
||||
// }
|
||||
// System.out.println("システムを終了します");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
|
||||
public abstract class Shape {
|
||||
private String name;
|
||||
|
||||
public Shape (String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public abstract double area() ;
|
||||
|
||||
public void showInfo() {
|
||||
System.out.println(this.name + "の面積は" +this.area() + "です");
|
||||
}
|
||||
}
|
||||
@@ -2,17 +2,19 @@
|
||||
public class Student {
|
||||
int studentId;
|
||||
String name;
|
||||
static int studentCount = 0;
|
||||
|
||||
void printProfile() {
|
||||
System.out.println("学籍番号;"+this.studentId+" 名前;"+this.name);
|
||||
void printProfile() {
|
||||
System.out.println("学籍番号:" + this.studentId + " 名前:" + this.name);
|
||||
}
|
||||
static int studentCount = 0;
|
||||
public Student (int studentId,String name){
|
||||
this.studentId = studentId;
|
||||
this.name = name;
|
||||
studentCount++;
|
||||
}
|
||||
static int getStudentCount() {
|
||||
|
||||
public Student(int studentId, String name) {
|
||||
this.studentId = studentId;
|
||||
this.name = name;
|
||||
studentCount++;
|
||||
}
|
||||
|
||||
public static int getStudentCount() {
|
||||
return studentCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user