回答編集履歴
3
ファクトリメソッドでfinalを初期化するコンストラクタを使えるようにする
answer
CHANGED
@@ -30,4 +30,50 @@
|
|
30
30
|
//その他処理
|
31
31
|
}
|
32
32
|
}
|
33
|
+
```
|
34
|
+
|
35
|
+
---
|
36
|
+
|
37
|
+
追記
|
38
|
+
ファクトリメソッドでの書き方
|
39
|
+
```java
|
40
|
+
class Car {
|
41
|
+
|
42
|
+
// Carの性能を表す変数(読み取り専用)
|
43
|
+
public final int spec;
|
44
|
+
|
45
|
+
Car() {
|
46
|
+
spec = 0;
|
47
|
+
}
|
48
|
+
|
49
|
+
// ファクトリメソッドで生成することを想定するためprivateにしたかったが、
|
50
|
+
// 継承して使えなくなるためprotectedにする
|
51
|
+
protected Car(int s) {
|
52
|
+
spec = s;
|
53
|
+
}
|
54
|
+
|
55
|
+
//ファクトリメソッド
|
56
|
+
public static Car createCar(int a, int b, int c) {
|
57
|
+
//長い計算
|
58
|
+
return new Car(計算結果);
|
59
|
+
}
|
60
|
+
|
61
|
+
// Carの多数のメソッド
|
62
|
+
}
|
63
|
+
|
64
|
+
class SuperCar extends Car {
|
65
|
+
|
66
|
+
SuperCar(int s) {
|
67
|
+
super(s);
|
68
|
+
}
|
69
|
+
|
70
|
+
//SuperCarのファクトリメソッド
|
71
|
+
public static SuperCar createSuperCar(仮パラメータ) {
|
72
|
+
//計算する
|
73
|
+
return new SuperCar(計算結果);
|
74
|
+
}
|
75
|
+
|
76
|
+
// SuperCarの多数のメソッドは、Carと共通
|
77
|
+
// だからSuperCarはCarを継承させた。
|
78
|
+
}
|
33
79
|
```
|
2
いろいろ修正
answer
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
であればそもそも継承して使うという事自体が間違っているのでは?
|
4
4
|
機能拡張するからこその継承であって、それを禁止するのなら継承という手段を使うのは適切ではないという事になります。
|
5
|
-
Baseクラスでzzzを初期化しないのならそもそもzzzというfinalフィールドが存在するべきではありませんし、値を変更できるようにしたいなら最低でもzzzに代入する数値を受け取るコンストラクタが必要です。
|
5
|
+
Baseクラスでzzzを初期化しないのならそもそもzzzというfinalフィールドが存在するべきではありませんし、値を変更できるようにしたいなら最低でも**zzzに代入する数値を受け取るコンストラクタ**が必要です。
|
6
6
|
もう一つのコンストラクタ`Base(int, int, int)`もそのコンストラクタを経由するようにもできますし、zzzに代入する値を渡すためのコンストラクタは設計上絶対必要だと思いますよ。
|
7
7
|
```java
|
8
8
|
public Base {
|
9
9
|
public final int zzz;
|
10
10
|
public Base() {
|
11
|
-
zzz = 0; //何か代入しなければいけない
|
11
|
+
zzz = 0; //何か代入しなければいけない。もしくはこのコンストラクタ自体を削除する
|
12
12
|
}
|
13
13
|
|
14
14
|
//zzzを任意の値で初期化するためのコンストラクタ
|
@@ -18,7 +18,9 @@
|
|
18
18
|
|
19
19
|
public Base(int a, int b, int c) {
|
20
20
|
this(a); //zzz初期化のコンストラクタ起動
|
21
|
-
//長い
|
21
|
+
//代入する値が何らかの長い計算によって出す必要があるなら、
|
22
|
+
//private staticなメソッドでも作ってそちらに計算を一任してこのaの部分に渡す
|
23
|
+
//あるいはコンストラクタの形ではなく、ファクトリメソッドでこのパターンを用意
|
22
24
|
}
|
23
25
|
}
|
24
26
|
|
1
1箇所セミコロン抜け
answer
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
|
14
14
|
//zzzを任意の値で初期化するためのコンストラクタ
|
15
15
|
public Base(int z){
|
16
|
-
zzz = z
|
16
|
+
zzz = z;
|
17
17
|
}
|
18
18
|
|
19
19
|
public Base(int a, int b, int c) {
|