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

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

ただいまの
回答率

90.48%

  • Java

    14097questions

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

  • デザインパターン

    66questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 858

apple159

score 5

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() もよくわかりません。
よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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の定義があります。

    詳細までつぶさに理解する必要がどこまであるかは自分にはわかりませんが、あんまりアバウトな理解でいいと言ってしまうのも、「車はアクセル踏めば進む、ブレーキ踏めば止まる。それが分かれば車は動く。」と言っているようなものですし、不明な部分は徐々にでも詳細を知ってより理解を深めていって頂ければ幸いです。

    キャンセル

0

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

どのような働きをしているのでしょうか? 
実行すると(インスタンス生成後の)ユニークなチケットナンバーを10件出力します。


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/16 22:16

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

    キャンセル

関連した質問

  • 解決済

    Javaで一度のみ外部の値で初期化でき、その後参照しかできない変数

    Javaでクラスで一つで一度のみ外部の値(可変)で初期化を行え、その後はカプセル化して値を変更できない変数を作りたいです。 追記します。 わかりずらく、申し訳ないです。 回答を

  • 解決済

    java 日付の取得と変更について

    javaの日付の取得と変更に関するコードについて質問です 参考書のとおりに、下記のコードを書いて実行してみたのですが 実行してみても、現在の日付から5日後の日付が出力されず、現在

  • 解決済

    javaでEclipseのプログラム

    クラス内変数について: 以下の条件を満たすプログラムについて、 作成例を示してください。 インスタンス生成時点の現在時刻を表示する機能をもつ シングルトランスを作成する。 2度目

  • 解決済

    Javaで文字列の中の特定の文字列を削除したいです。

    Java初心者です。 Javaで、文字列の中で特定の文字列を削除したいのですがやり方がわかりません。 例えば A + B C + D123 E + FFFF など式があるとして

  • 解決済

    static変数を同時にnewした場合の生成順序は?

    以下のjavaのシングルトンのソースコードを読んでいて気になっていたのですが、 同時にHogeクラスがロードされnew Hoge()を生成された場合の順序はどうなるのでしょうか?

  • 解決済

    Javaのスレッドの対象インスタンスについて

    Javaのsynchronized修飾子の対象インスタンスについての質問です。 http://www.tohoho-web.com/java/thread.htm こちらの記事

  • 解決済

    以下の状況での再利用性

    http://www.nulab.co.jp/designPatterns/designPatterns2/designPatterns2-2.html こちらのサイトを参考にし

  • 解決済

    [Java]synchronizedブロックの使用箇所

    前提・実現したいこと synchronizedブロックを使用する箇所が、一般的な書き方ではどこになるのかが気になりました。 該当のソースコード public class

同じタグがついた質問を見る

  • Java

    14097questions

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

  • デザインパターン

    66questions

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