質問編集履歴

1

2022/01/13 05:11

投稿

guijiu
guijiu

スコア36

test CHANGED
File without changes
test CHANGED
@@ -1,219 +1,113 @@
1
1
  #前書き
2
-
3
2
  [Effective Java第3版](https://www.maruzen-publishing.co.jp/item/?book_no=303408)(以下、本書という)を勉強しています。訳あって「項目26 原型を使わない」の項目から勉強を始めましたが、Javaに対する基礎的な理解不足もあり、1ページを読み終わらずしていくつもの「?マーク」が浮かび上がりました。この本は流し読みできるような代物ではないと悟り、反芻(はんすう)して取り組もうと考えています。
4
3
 
5
-
6
-
7
4
  #1.質問
8
-
9
5
  そこで質問があります。
10
-
11
6
  本書120ページに模範的なコードではない例として次のコードが挙げられています。13行目にstamp.cancel()と記述されていますが、この**__cancel()__**メソッドは、どのような機能を持ち、またどのような由来(何かのインタフェースや抽象メソッドを実装・継承)を持つのでしょうか?(まさかとは思いますが、意味のないコードが記述されていることはないと思いますが、、、)
12
-
13
-
14
7
 
15
8
  ```java
16
9
 
10
+ // 原型のコレクション型 - これをやってはいけない!
17
11
 
12
+ // 私の切手コレクション。Stampインスタンスだけを含む。
13
+ private final Collection stamps = new ArrayList();
14
+
15
+ // 切手コレクションへのコインの誤った挿入
16
+ stamps.add(new Coin(100, "花")); // 「無検査呼び出し」の警告表示
17
+
18
+ // 切手コレクションからコインを取り出すまで、エラーになりません。
19
+ // 原型のイテレータ型 - これをやってはいけない!
20
+ for (Iterator<Stamp> i = stamps.iterator(); i.hasNext(); ) {
21
+ Stamp stamp = (Stamp) i.next(); // ClassCastExceptionがスローされる
22
+ stamp.cancel();  // <==疑問点 この**__cancel()__**メソッドはどの様な由来がり、機能をもつのか?
23
+ }
24
+
25
+ ```
26
+
27
+ #2.自分で調べたこと
28
+ ##2.1 検索
29
+ Google検索で、「java  cancel()」をキーワードにして、検索してみましたが、それらしいものは見つかりませんでした。
30
+ ##2.2 実行可能な誤ったソースコードを書いてみる
31
+  上記の説明用のソースコードを元に、自分なりに実行可能なコードを書いてみました。一部アクセス修飾子privateについてエラーが解決できなかったので、その部分は削除しました。
32
+ 結果、想定されたエラーを生じることが確認できましたし、またCoinオブジェクトを追加しないことでエラーのない動作を確認できました。しかし、**__cancel()__**の機能は理解できませんでした。
33
+
34
+ ```
35
+ import java.util.ArrayList;
36
+ import java.util.Collection;
37
+ import java.util.Iterator;
38
+
39
+ public class Item26_1 {
40
+ public static void main(String[] args) {
18
41
 
19
42
  // 原型のコレクション型 - これをやってはいけない!
20
43
 
44
+ // 私の切手コレクション。Stampインスタンスだけを含む。
45
+ final Collection stamps = new ArrayList();
46
+ // private final Collection stamps = new ArrayList(); // 本書での記述
47
+ // 本書での記述ではアクセス修飾子privateを含むが、
48
+ // Modifier 'private' not Allowed here. Make 'stamps' not private.
49
+ //(修飾子「private」はここでは許可されません。スタンプを非公開にする)と
50
+ // エラー表示される。別途、調査中。==>メソッド内の変数のため、アクセス
51
+ // 修飾子をつけることができない(メソッド内の変数は、既に隠蔽されているので
52
+ // アクセス修飾子をつける必要がない)。もし変数をメソッドの外側に置いて、
53
+ // クラス変数とすればアクセス修飾子をつける必要が出てくる。
21
54
 
55
+ stamps.add(new Stamp(150, "山"));
56
+ stamps.add(new Stamp(250, "川"));
57
+ // 切手コレクションへのコインの誤った挿入
58
+ stamps.add(new Coin(100, "花")); // 「無検査呼び出し」の警告表示
22
59
 
23
- // 切手コクション。Stampインスンスだを含む。
60
+ // 原型イテ型 - これをやってはいない!
61
+ for (Iterator i = stamps.iterator(); i.hasNext(); ) {
62
+ Stamp stamp = (Stamp) i.next(); // ClassCastExceptionがスローされる
63
+ //stamp.cancel();  // <==疑問点 このcancel()メソッドはどの様な由来がり、機能をもつのか?
64
+ // エラーが生じるのでコメントアウトした。
24
65
 
25
- private final Collection stamps = new ArrayList();
66
+ System.out.println(stamp.toString());
26
-
27
-
28
-
29
- // 切手コレクションへのコインの誤った挿入
30
-
31
- stamps.add(new Coin(100, "花")); // 「無検査呼び出し」の警告表示
32
-
33
-
34
-
35
- // 切手コレクションからコインを取り出すまで、エラーになりません。
36
-
37
- // 原型のイテレータ型 - これをやってはいけない!
38
-
39
- for (Iterator<Stamp> i = stamps.iterator(); i.hasNext(); ) {
40
-
41
- Stamp stamp = (Stamp) i.next(); // ClassCastExceptionがスローされる
42
-
43
- stamp.cancel();  // <==疑問点 この**__cancel()__**メソッドはどの様な由来がり、機能をもつのか?
44
-
45
- }
67
+ }
46
-
68
+ }
47
-
69
+ }
70
+ ```
48
71
 
49
72
  ```
73
+ public class Stamp {
74
+ private int value;
75
+ private String design;
50
76
 
51
-
52
-
53
- #2.自分で調べたこと
54
-
55
- ##2.1 検索
56
-
57
- Google検索で、「java  cancel()」をキーワードにして、検索してみましたが、それらしいものは見つかりませんでした。
58
-
59
- ##2.2 実行可能な誤ったソースコードを書いてみる
60
-
61
-  上記の説明用のソースコードを元に、自分なりに実行可能なコードを書いてみました。一部アクセス修飾子privateについてエラーが解決できなかったので、その部分は削除しました。
62
-
63
- 結果、想定されたエラーを生じることが確認できましたし、またCoinオブジェクトを追加しないことでエラーのない動作を確認できました。しかし、**__cancel()__**の機能は理解できませんでした。
64
-
65
-
66
-
67
- ```
68
-
69
- import java.util.ArrayList;
70
-
71
- import java.util.Collection;
72
-
73
- import java.util.Iterator;
74
-
75
-
76
-
77
- public class Item26_1 {
78
-
79
- public static void main(String[] args) {
77
+ public Stamp(int value, String design){
80
-
81
-
82
-
83
- // 原型のコレクション型 - これをやってはいけない!
78
+ this.value = value;
84
-
85
-
86
-
87
- // 私の切手コレクション。Stampインスタンスだけを含む。
88
-
89
- final Collection stamps = new ArrayList();
79
+ this.design = design;
90
-
91
- // private final Collection stamps = new ArrayList(); // 原型
92
-
93
- // 本来はアクセス修飾子privateを含むが、
94
-
95
- // Modifier 'private' not Allowed here. Make 'stamps' not private.
96
-
97
- //(修飾子「private」はここでは許可されません。スタンプを非公開にする)と
98
-
99
- // エラー表示される。別途、調査中。
100
-
101
-
102
-
103
- stamps.add(new Stamp(150, "山"));
104
-
105
- stamps.add(new Stamp(250, "川"));
106
-
107
- // 切手コレクションへのコインの誤った挿入
108
-
109
- stamps.add(new Coin(100, "花")); // 「無検査呼び出し」の警告表示
110
-
111
-
112
-
113
- // 原型のイテレータ型 - これをやってはいけない!
114
-
115
- for (Iterator i = stamps.iterator(); i.hasNext(); ) {
116
-
117
- Stamp stamp = (Stamp) i.next(); // ClassCastExceptionがスローされる
118
-
119
- //stamp.cancel();  // <==疑問点 このcancel()メソッドはどの様な由来がり、機能をもつのか?
120
-
121
- // エラーが生じるのでコメントアウトした。
122
-
123
-
124
-
125
- System.out.println(stamp.toString());
126
-
127
- }
128
-
129
80
  }
130
81
 
82
+ @Override
83
+ public String toString() {
84
+ return "Stamp{" +
85
+ "value=" + value +
86
+ ", design='" + design + '\'' +
87
+ '}';
88
+ }
131
89
  }
132
90
 
133
91
  ```
134
-
135
-
136
-
137
92
  ```
138
-
139
- public class Stamp {
93
+ public class Coin {
140
-
141
94
  private int value;
142
-
143
95
  private String design;
144
96
 
145
97
 
146
-
147
- public Stamp(int value, String design){
98
+ public Coin(int value, String design){
148
-
149
99
  this.value = value;
150
-
151
100
  this.design = design;
152
-
153
101
  }
154
102
 
155
-
156
-
157
103
  @Override
158
-
159
104
  public String toString() {
160
-
161
- return "Stamp{" +
105
+ return "Coin{" +
162
-
163
106
  "value=" + value +
164
-
165
107
  ", design='" + design + '\'' +
166
-
167
108
  '}';
168
-
169
109
  }
170
-
171
110
  }
172
111
 
173
-
174
-
175
112
  ```
176
-
177
- ```
178
-
179
- public class Coin {
180
-
181
- private int value;
182
-
183
- private String design;
184
-
185
-
186
-
187
-
188
-
189
- public Coin(int value, String design){
190
-
191
- this.value = value;
192
-
193
- this.design = design;
194
-
195
- }
196
-
197
-
198
-
199
- @Override
200
-
201
- public String toString() {
202
-
203
- return "Coin{" +
204
-
205
- "value=" + value +
206
-
207
- ", design='" + design + '\'' +
208
-
209
- '}';
210
-
211
- }
212
-
213
- }
214
-
215
-
216
-
217
- ```
218
-
219
113
  以上、**__cancel()__**メソッドについての質問です。ご教示のほどよろしくお願いします。