書きかけ
Javaのクラス設計
不変クラス
- クラス:継承されないようにfinal宣言
- フィールド:外部からのアクセスと変更を不可にするため、private final宣言
- アクセサメソッド:ゲッターメソッドのみ提供
static初期化子
public class Test {
static int x;
static { x = 1; }
Enum
- 自動的にfinalクラスとしてコンパイルされるため、修飾子にfinalやabstructは指定できない
- 自動的にstaticが修飾されるが、明示的にstaticを付けてもよい
- extendsはできないが、implementsは可能
- メソッド内での宣言は不可
- コンストラクタは必ずprivateで宣言する
- フィールドやメソッドを記述する場合は、列挙定数の最後にセミコロンが必要。記述しない場合は、セミコロンは付けても付けなくてもよい
メソッド | 説明 |
---|---|
static E valueOf(String name) | 指定された名前の列挙定数を返却 |
static E[] values() | 列挙型の配列を返却 |
String name() | 列挙定数名を文字列としたを返却 |
int ordinal() | 0から始まる列挙定数の序数を返却 |
Java8での追加要素
interface A {
static void test1() {
System.out.println("static");
}
default void test2() {
System.out.println("default");
}
}
class B implements A { }
class test {
public static void main(String[] args) {
A.test1(); // 「static」
A.test2(); // コンパイルエラー
B b = new B();
b.test1(); // コンパイルエラー
b.test2(); // 「default」
}
}
- 同じシグニチャのdefaultメソッドを持つinterfaceを多重継承した場合、コンパイルエラーが発生する。そのため、オーバーライドする必要性がある。
- 同じシグニチャのdefaultメソッドを持つinterfaceの型階層の距離が違う場合は多重継承が可能である。その際、距離が最も近いdefaultメソッドが呼び出される。
デザインパターン
シングルトン
public class Singleton {
private static Singleton s = new Singleton(); // 1
private Singleton() {} // 2
public static Singleton getInstance(){ // 3
return singleton;
}
}
①インスタンスが常に一つだけ生成されるように、private staticフィールドを宣言する。
②外部からインスタンスを生成できないように、コンストラクタをprivateで宣言する。
③外部からインスタンス参照を取得できるように、インスタンスを返却するpublic staticメソッドを宣言する。