teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

ファクトリメソッドでfinalを初期化するコンストラクタを使えるようにする

2016/02/07 13:01

投稿

swordone
swordone

スコア20675

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

いろいろ修正

2016/02/07 13:01

投稿

swordone
swordone

スコア20675

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箇所セミコロン抜け

2016/02/07 09:38

投稿

swordone
swordone

スコア20675

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) {