#前書き
Effective Java第3版(以下、本書という)を勉強しています。訳あって「項目26 原型を使わない」の項目から勉強を始めましたが、Javaに対する基礎的な理解不足もあり、1ページを読み終わらずしていくつもの「?マーク」が浮かび上がりました。この本は流し読みできるような代物ではないと悟り、反芻(はんすう)して取り組もうと考えています。
#1.質問
そこで質問があります。
本書120ページに模範的なコードではない例として次のコードが挙げられています。13行目にstamp.cancel()と記述されていますが、この**cancel()**メソッドは、どのような機能を持ち、またどのような由来(何かのインタフェースや抽象メソッドを実装・継承)を持つのでしょうか?(まさかとは思いますが、意味のないコードが記述されていることはないと思いますが、、、)
java
1 2// 原型のコレクション型 - これをやってはいけない! 3 4 // 私の切手コレクション。Stampインスタンスだけを含む。 5 private final Collection stamps = new ArrayList(); 6 7 // 切手コレクションへのコインの誤った挿入 8 stamps.add(new Coin(100, "花")); // 「無検査呼び出し」の警告表示 9 10// 切手コレクションからコインを取り出すまで、エラーになりません。 11 // 原型のイテレータ型 - これをやってはいけない! 12 for (Iterator<Stamp> i = stamps.iterator(); i.hasNext(); ) { 13 Stamp stamp = (Stamp) i.next(); // ClassCastExceptionがスローされる 14 stamp.cancel(); // <==疑問点 この**__cancel()__**メソッドはどの様な由来がり、機能をもつのか? 15 } 16
#2.自分で調べたこと
##2.1 検索
Google検索で、「java cancel()」をキーワードにして、検索してみましたが、それらしいものは見つかりませんでした。
##2.2 実行可能な誤ったソースコードを書いてみる
上記の説明用のソースコードを元に、自分なりに実行可能なコードを書いてみました。一部アクセス修飾子privateについてエラーが解決できなかったので、その部分は削除しました。
結果、想定されたエラーを生じることが確認できましたし、またCoinオブジェクトを追加しないことでエラーのない動作を確認できました。しかし、**cancel()**の機能は理解できませんでした。
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Item26_1 { public static void main(String[] args) { // 原型のコレクション型 - これをやってはいけない! // 私の切手コレクション。Stampインスタンスだけを含む。 final Collection stamps = new ArrayList(); // private final Collection stamps = new ArrayList(); // 本書での記述 // 本書での記述ではアクセス修飾子privateを含むが、 // Modifier 'private' not Allowed here. Make 'stamps' not private. //(修飾子「private」はここでは許可されません。スタンプを非公開にする)と // エラー表示される。別途、調査中。==>メソッド内の変数のため、アクセス // 修飾子をつけることができない(メソッド内の変数は、既に隠蔽されているので // アクセス修飾子をつける必要がない)。もし変数をメソッドの外側に置いて、 // クラス変数とすればアクセス修飾子をつける必要が出てくる。 stamps.add(new Stamp(150, "山")); stamps.add(new Stamp(250, "川")); // 切手コレクションへのコインの誤った挿入 stamps.add(new Coin(100, "花")); // 「無検査呼び出し」の警告表示 // 原型のイテレータ型 - これをやってはいけない! for (Iterator i = stamps.iterator(); i.hasNext(); ) { Stamp stamp = (Stamp) i.next(); // ClassCastExceptionがスローされる //stamp.cancel(); // <==疑問点 このcancel()メソッドはどの様な由来がり、機能をもつのか? // エラーが生じるのでコメントアウトした。 System.out.println(stamp.toString()); } } }
public class Stamp { private int value; private String design; public Stamp(int value, String design){ this.value = value; this.design = design; } @Override public String toString() { return "Stamp{" + "value=" + value + ", design='" + design + '\'' + '}'; } }
public class Coin { private int value; private String design; public Coin(int value, String design){ this.value = value; this.design = design; } @Override public String toString() { return "Coin{" + "value=" + value + ", design='" + design + '\'' + '}'; } }
以上、**cancel()**メソッドについての質問です。ご教示のほどよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー