はじめに
こんにちは ◤●ㅅ●◥ノ
今回は型安全から様々な種類のクラスについて学びました!
第2章 さまざまな種類のクラス
1.型安全
Javaでは変数の宣言をするとき必ず型を指定する
型を指定することでintなら整数、Stringなら文字列の情報のみ格納される
→格納するデータに制約をかける仕組みである
なぜ制約をかける必要があるのか?色々な情報を入れられたら楽なのでは?
→呼び出しの際に間違える可能性がある、コンパイルの時にエラーが出ないため気づきにくい
→変数に予期しない種類の情報が入ってしまうことを未然に防いでいる
型によって担保される安全性... 型安全
Javaには型安全のメリットをより享受するために
「ジェネリクス」や「列挙型」という仕組みがある
2.ジェネリクス
ArrayListをはじめとするコレクションクラス
→ArrayListのように<>で型を制限している
→型安全のためにコレクションクラスは常に<~>をつけて利用する
なぜコレクションくらすだけ<~>が使えるのか?
→ArrayListやHashMapは普通のクラスではなく ジェネリクス という特別な仕組みを使って定義されている
ジェネリクスの確認方法
APIリファレンスにおいても<~>という表記があるためそこで確認する
ジェネリクスはクラスだけでなくメソッドでも使うことができる
ジェネリクスのメソッド
アクセス修飾子 static<T> 戻り値 メソッド名(引数リスト)
{メソッドの処理内容}
3.列挙型
Javaでは指定した種類の値だけを入れることのできる列挙型を利用することができる
列挙型の定義
アクセス修飾子 enum 列挙型名 {
列挙子1, 列挙子2, 列挙子3, ...列挙子x,
}
4.インナークラス
Javaではクラス宣言ブロックの中にさらにクラス宣言を書くことができる
→内部に宣言されたクラス... インナークラス という
インナークラスは宣言される場所によって3種類に分類される
・メンバクラス
宣言場所:クラスブロックの中、フィールドやメソッドの隣
・ローカルクラス
宣言場所:メソッドブロックの中、他の文の隣
・匿名クラス
宣言場所:文の中(式の一部、親クラス名を指定)
3種類のインナークラスに共通する特徴
・あるクラスの内部で宣言される
・外側クラスのメンバや変数に対して特別にアクセスできる
メンバクラス
あるクラスのメンバとして定義するクラス
※メンバ...クラスに用意した変数やメソッドを総称してメンバと呼ぶ
通常のクラスとの大きな違い
・クラスブロックの中でメンバとして宣言する
・protextedやprivateといったアクセス修飾も利用可能である
また、staticがあるかどうかで利用法が変わる
staticメンバクラスの特徴
・基本的に「外部クラス名、メンバクラス名」で利用する
・外部クラスのメンバにアクセスできるがstaticなものに限られる
staticなしメンバクラスの特徴
・外部クラスのインスタンスがなければnewできない
・結びついている外部インスタンスの非staticメンバにもアクセスできない
ローカルクラス
メソッドブロックで宣言されるクラス定義
ローカルクラスの特徴
・宣言したメソッド内でのみ有効で、他のクラスやメソッドからは利用できない
・finalとabstract以外の修飾は行えない
・外部クラスのメンバにはアクセス可能
匿名クラス
通常のクラスや他のインナークラスと比較してもかなり異質な存在
匿名クラスの特異性
通常のクラスやメンバクラスは、classキーワードでまず定義を「宣言」し、
その後newで「利用」するが、匿名クラスは「宣言と利用」を同時に行う
匿名クラスの宣言兼利用
new 匿名クラスの親クラス指定(){
匿名クラスの内容(メンバ)定義
}
5.null安全性
null安全とは
変数にnullが格納される余地があると、例外や不具合の原因になる可能性がある。
そのためプログラミング言語として「そもそもnullを格納できない仕組み」や
「nullが格納されている可能性を考慮したプログラムの記述が強制される仕組み」を備えることが望ましい
利用法
Optionalクラスをメソッドの戻り値の型として用いることで、null安全に考慮したプログラムを生成できる
まとめ
型は変数に予期しない種類の情報が入ってしまうことを未然に防いでいる
このように型によって担保される安全性のことを型安全という
ArrayListをはじめとするコレクションクラスや型列挙、インナークラスを使うことで型安全のメリットを享受しやすくなる
インナークラスには3種類の分類に別れており、共通点はあるクラスの内部で宣言される、外側クラスのメンバや変数に対して特別にアクセスできることの2つである