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

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

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

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

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

Q&A

解決済

2回答

2356閲覧

このプログラムについて教えて下さい(singletonパターン)

apple159

総合スコア13

Java

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

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

0グッド

1クリップ

投稿2015/07/16 10:43

public class TicketMaker {
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() もよくわかりません。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

javaは普通クラスのインスタンスを作成すると、定義されたオブジェクトのコピーが生成されることはご存知でしょうか。
static指定を行うと、このコピーが行われずに、最初の定義がそのまま利用される形になります。つまり、(インスタンスをいくつ作ろうとも)プログラムの中に1つしか実装が存在しない状態を作るための定義です。

synchronizedのほうは、マルチスレッドに関連する定義です。
スレッド処理をしていない場合などで処理が常に1系統の場合には関係ありませんが、プログラム内で複数の処理を同時に実行する可能性がある場合、且つ(static定義をされていて)プログラム中に1つしかないリソースがそれら複数のスレッドからほぼ同じタイミングで使用された場合、そのリソースの利用は排他制御されなければ正しい結果が得られない場合が多々出てきます。
そういった状況に対応する場合に指定されます。

投稿2015/07/16 11:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

apple159

2015/07/16 13:16

コピーされるとはしりませんでした。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2015/07/17 10:00 編集

すみません。概念の解釈として一旦そのように説明した方が話が分かりやすいので、そのように書きました。 より詳細に捉えるには、インスタンスの中身を以下の2つに分けて考えます。 ・ロジック、としての実装(プログラム) ・データ、としてのメンバ変数 javaはデータ部分をインスタンス内の固有の情報として持ちますが、ロジック部分はあくまでも参照情報だけを持ちます。ロジック部分は基本変わらないので、基本的にはコピーしているのと同じように振る舞ってくれます。 (static指定の場合はデータ部分も参照扱いになって、プログラム中にたった1つしかない状態を作ってくれる) 修正:shallow-copy, deep-copyは、引き合いに出すのに適切な話ではなかったので削除しました。
退会済みユーザー

退会済みユーザー

2015/07/17 10:29

補足的な話をした方が良いかと思ったので、ついでに。 javaはオブジェクト指向言語なので、基本の考え方として「オブジェクトとインスタンス」という概念があります。 ・オブジェクトは、データやロジックの定義。 ・インスタンスは、オブジェクトを実体化させたもの。 と、いう感じになると思いますが、インスタンスは生成するごとに異なる存在として生み出されるので、通常は作るたびにその存在を増やします。 でも、常に只1つしかないものを使いまわしたい。(=singleton)という 要求があった場合はちょっと困ります。インスタンス生成は通常、常に新しい存在が作られるわけです。どこからでも同じものを呼び出すには、どうしたらいいのか?という話になります。 そのあたりに対応する方法として staticの定義があります。 詳細までつぶさに理解する必要がどこまであるかは自分にはわかりませんが、あんまりアバウトな理解でいいと言ってしまうのも、「車はアクセル踏めば進む、ブレーキ踏めば止まる。それが分かれば車は動く。」と言っているようなものですし、不明な部分は徐々にでも詳細を知ってより理解を深めていって頂ければ幸いです。
guest

0

TicketMaker.getInstance().getNextTicketNumber() もよくわかりません。

getInstanceメソッド経由でTicketMakerクラス唯一のインスタンスオブジェクトにアクセスして、getNextTicketNumberメソッドを実行しています。
getNextTicketNumberメソッドは、そのインスタンスのticketメンバをインクリメントして、処理後の数値を呼び出し元に返しています。

どのような働きをしているのでしょうか?

実行すると(インスタンス生成後の)ユニークなチケットナンバーを10件出力します。

チケット番号を得たいだけならもう少し簡単に書けそうなものなのに
どうして回りくどいやり方をしているのかというと
singletonパターンの目的を果たすためです。

投稿2015/07/16 11:29

hirohiro

総合スコア2068

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

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

apple159

2015/07/16 13:16

流れを記述して頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問