回答編集履歴

3

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

2016/02/07 13:01

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -63,3 +63,95 @@
63
63
  }
64
64
 
65
65
  ```
66
+
67
+
68
+
69
+ ---
70
+
71
+
72
+
73
+ 追記
74
+
75
+ ファクトリメソッドでの書き方
76
+
77
+ ```java
78
+
79
+ class Car {
80
+
81
+
82
+
83
+ // Carの性能を表す変数(読み取り専用)
84
+
85
+ public final int spec;
86
+
87
+
88
+
89
+ Car() {
90
+
91
+ spec = 0;
92
+
93
+ }
94
+
95
+
96
+
97
+ // ファクトリメソッドで生成することを想定するためprivateにしたかったが、
98
+
99
+ // 継承して使えなくなるためprotectedにする
100
+
101
+ protected Car(int s) {
102
+
103
+ spec = s;
104
+
105
+ }
106
+
107
+
108
+
109
+ //ファクトリメソッド
110
+
111
+ public static Car createCar(int a, int b, int c) {
112
+
113
+ //長い計算
114
+
115
+ return new Car(計算結果);
116
+
117
+ }
118
+
119
+
120
+
121
+ // Carの多数のメソッド
122
+
123
+ }
124
+
125
+
126
+
127
+ class SuperCar extends Car {
128
+
129
+
130
+
131
+ SuperCar(int s) {
132
+
133
+ super(s);
134
+
135
+ }
136
+
137
+
138
+
139
+ //SuperCarのファクトリメソッド
140
+
141
+ public static SuperCar createSuperCar(仮パラメータ) {
142
+
143
+ //計算する
144
+
145
+ return new SuperCar(計算結果);
146
+
147
+ }
148
+
149
+
150
+
151
+ // SuperCarの多数のメソッドは、Carと共通
152
+
153
+ // だからSuperCarはCarを継承させた。
154
+
155
+ }
156
+
157
+ ```

2

いろいろ修正

2016/02/07 13:01

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  機能拡張するからこその継承であって、それを禁止するのなら継承という手段を使うのは適切ではないという事になります。
8
8
 
9
- Baseクラスでzzzを初期化しないのならそもそもzzzというfinalフィールドが存在するべきではありませんし、値を変更できるようにしたいなら最低でもzzzに代入する数値を受け取るコンストラクタが必要です。
9
+ Baseクラスでzzzを初期化しないのならそもそもzzzというfinalフィールドが存在するべきではありませんし、値を変更できるようにしたいなら最低でも**zzzに代入する数値を受け取るコンストラクタ**が必要です。
10
10
 
11
11
  もう一つのコンストラクタ`Base(int, int, int)`もそのコンストラクタを経由するようにもできますし、zzzに代入する値を渡すためのコンストラクタは設計上絶対必要だと思いますよ。
12
12
 
@@ -18,7 +18,7 @@
18
18
 
19
19
  public Base() {
20
20
 
21
- zzz = 0; //何か代入しなければいけない
21
+ zzz = 0; //何か代入しなければいけない。もしくはこのコンストラクタ自体を削除する
22
22
 
23
23
  }
24
24
 
@@ -38,7 +38,11 @@
38
38
 
39
39
  this(a); //zzz初期化のコンストラクタ起動
40
40
 
41
- //長い処理
41
+ //代入する値が何らかの長い計算によって出す必要があるなら、
42
+
43
+ //private staticなメソッドでも作ってそちらに計算を一任してこのaの部分に渡す
44
+
45
+ //あるいはコンストラクタの形ではなく、ファクトリメソッドでこのパターンを用意
42
46
 
43
47
  }
44
48
 

1

1箇所セミコロン抜け

2016/02/07 09:38

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  public Base(int z){
30
30
 
31
- zzz = z
31
+ zzz = z;
32
32
 
33
33
  }
34
34