質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1235閲覧

「Effective Java第3版 項目26 原型を使わない」についての質問

guijiu

総合スコア35

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2022/01/11 01:37

編集2022/01/13 05:11

#前書き
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()**メソッドについての質問です。ご教示のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/01/11 01:58

項目26は「第5章 ジェネリックス」の中にあるので、ジェネリクスを正しく使おうということで、要素の型を指定しない Collection や ArrayList (これらを原型と呼んでるようですが、あまり聞かないですね…) ではなく、Collection<Stamp> や ArrayList<Coin> のように要素の型を指定すべしってことでしょうね。
guijiu

2022/01/11 02:36

ご回答いただき、ありがとうございます。 Javaの勉強を始めた時の本(川場著わかりやすいjavaオブジェクト編)にも、Collection<Stamp> や ArrayList<Coin> のように要素の型を指定すべしということは書かれていました。 どうも私、基礎ができていないようで、この事柄についてすっかり忘れていました。基礎ができている人ならEffectiveJavaの文章の行間に書かれていることが理解できるのでしょうが、私は一行読むたびに疑問符が浮かび上がる状態です。
jimbe

2022/01/11 04:57 編集

もし記述の誤りっぽいのでしたら柴田氏の正誤表を確認出来ます。(原書の正誤表へのリンクもあります。) https://yoshikishibata.github.io/#ERRATA ちなみに(私の持っている)第2版(2001年11月30日初版、2008年12月25日第2版第2刷)では、項目26「ジェネリック型を使用する」のサンプルは、項目8「廃れたオブジェクト参照を取り除く」のサンプル Stack クラスをジェネリック仕様にする形になっています。
guest

回答1

0

ベストアンサー

このcancel()メソッドは、どのような機能を持ち、またどのような由来(何かのインタフェースや抽象メソッドを実装・継承)を持つのでしょうか?

Java的な特別な意味などない、単なるメソッドの例です。

投稿2022/01/11 01:42

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/01/11 01:44

このcancelは「消印を押す」という「英語としての」意味はありますが、それ以上のものではありません。
guijiu

2022/01/11 02:29

ご回答ありがとうございます。 本筋ではない些末なことに悩んでいたようですね。お恥ずかしい。EffectiveJavaのオンライン勉強会に参加しようと思い第26項目から読み始めましたが、基礎ができていないためか端折るべき部分がよく分からず質問しました。
xebme

2022/01/11 04:26 編集

第20回『Effective Java 第3版』オンライン読書会 https://ej3e-reading.connpass.com/event/233933/ 次回は、1/15 Item 28 からですね。 17:00 - 質問タイムあり。わからないことは柴田さんに直接聞けますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問