このプログラムについて教えて下さい(singletonパターン)
解決済
回答 2
投稿
- 評価
- クリップ 1
- VIEW 1,730
private static TicketMaker singleton = new TicketMaker();
private int ticket = 1000;
private TicketMaker(){
}
public static TicketMaker getInstance(){
return singleton;
}
public synchronized int getNextTicketNumber() {
return ticket++;
}
}
public class MainQ {
public static void main(String[] args) {
System.out.println("START");
for(int i=0; i<10; i++){
System.out.println(i + ":" + TicketMaker.getInstance().getNextTicketNumber());
}
System.out.println("END");
}
}
まず、staticとsynchronizedの意味がよくわかっておらず、この時どのような働きをしているのでしょうか?
また、TicketMaker.getInstance().getNextTicketNumber() もよくわかりません。
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
static指定を行うと、このコピーが行われずに、最初の定義がそのまま利用される形になります。つまり、(インスタンスをいくつ作ろうとも)プログラムの中に1つしか実装が存在しない状態を作るための定義です。
synchronizedのほうは、マルチスレッドに関連する定義です。
スレッド処理をしていない場合などで処理が常に1系統の場合には関係ありませんが、プログラム内で複数の処理を同時に実行する可能性がある場合、且つ(static定義をされていて)プログラム中に1つしかないリソースがそれら複数のスレッドからほぼ同じタイミングで使用された場合、そのリソースの利用は排他制御されなければ正しい結果が得られない場合が多々出てきます。
そういった状況に対応する場合に指定されます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
TicketMaker.getInstance().getNextTicketNumber() もよくわかりません。getInstanceメソッド経由でTicketMakerクラス唯一のインスタンスオブジェクトにアクセスして、getNextTicketNumberメソッドを実行しています。
getNextTicketNumberメソッドは、そのインスタンスのticketメンバをインクリメントして、処理後の数値を呼び出し元に返しています。
どのような働きをしているのでしょうか?実行すると(インスタンス生成後の)ユニークなチケットナンバーを10件出力します。
チケット番号を得たいだけならもう少し簡単に書けそうなものなのに
どうして回りくどいやり方をしているのかというと
singletonパターンの目的を果たすためです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2015/07/16 22:16
ありがとうございました。
2015/07/17 18:38 編集
より詳細に捉えるには、インスタンスの中身を以下の2つに分けて考えます。
・ロジック、としての実装(プログラム)
・データ、としてのメンバ変数
javaはデータ部分をインスタンス内の固有の情報として持ちますが、ロジック部分はあくまでも参照情報だけを持ちます。ロジック部分は基本変わらないので、基本的にはコピーしているのと同じように振る舞ってくれます。
(static指定の場合はデータ部分も参照扱いになって、プログラム中にたった1つしかない状態を作ってくれる)
修正:shallow-copy, deep-copyは、引き合いに出すのに適切な話ではなかったので削除しました。
2015/07/17 19:29
javaはオブジェクト指向言語なので、基本の考え方として「オブジェクトとインスタンス」という概念があります。
・オブジェクトは、データやロジックの定義。
・インスタンスは、オブジェクトを実体化させたもの。
と、いう感じになると思いますが、インスタンスは生成するごとに異なる存在として生み出されるので、通常は作るたびにその存在を増やします。
でも、常に只1つしかないものを使いまわしたい。(=singleton)という 要求があった場合はちょっと困ります。インスタンス生成は通常、常に新しい存在が作られるわけです。どこからでも同じものを呼び出すには、どうしたらいいのか?という話になります。
そのあたりに対応する方法として staticの定義があります。
詳細までつぶさに理解する必要がどこまであるかは自分にはわかりませんが、あんまりアバウトな理解でいいと言ってしまうのも、「車はアクセル踏めば進む、ブレーキ踏めば止まる。それが分かれば車は動く。」と言っているようなものですし、不明な部分は徐々にでも詳細を知ってより理解を深めていって頂ければ幸いです。