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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

8回答

61335閲覧

シングルトンがなぜ必要なのか

bananafish

総合スコア65

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

5グッド

23クリップ

投稿2016/06/02 02:06

編集2016/06/02 02:24

自分がインスタンスというものを決まり文句としてしか理解できていないからなのですが、シングルトンの重要性があまりわかりません。
調べてみてもいまいちピンきませんでした、インスタンスがなぜ一つじゃないといけないのか,どのような場面でシングルトンを使うのか、どなたか教えて頂けないでしょうか。

o-sei, ikuwow, Reiman, kuwako, usagilove👍を押しています

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

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

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

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

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

guest

回答8

0

ベストアンサー

インスタンスがなぜ一つじゃないといけないのか

使えるリソースが一つだけの場合、それにアクセスするクラスインスタンスも一つだけの方が都合が良い場合が多いからです。

例えば、画面に何か出力するとき、JavaではSystem.outを使いますが、それは「標準出力」というたった一つしかないリソースに対してアクセスを行うために、staticフィールドで定義されたインスタンスであり、staticなのでプロセス内には1個しかインスタンスがありません。

なぜそうしているのかというと、画面に何か書きたいときに、いちいちnewしてクラスインスタンスを作るのは面倒だし、そのたびにnewしていたら無駄にメモリを食うし、それを避けるために一度newしたものを別のクラスでも使い回そうとすると、そのインスタンスの受け渡しをどうするのかという問題が出てくるし……。
ということで、staticフィールドにインスタンスを作ってそれをみんなで使い回すことにするのです。

どのような場面でシングルトンを使うのか

シングルトン(パターン)はインスタンスを一つしか作らないことを「保証する」ための仕組みです。
ただ単にインスタンスを一つにしたいというだけならstaticフィールドにすればできますが、それを知らずに誰かがnewしてしまったらインスタンスが複数になってしまいます。あるいは、staticフィールドにインスタンスを作りたいけど、初期化の順番をコントロールしたい、というケースもあるかもしれません。マルチスレッドでの動作を考慮しないといけないかもしれません。
そういうときに一手間かけてシングルトン(パターン)を使います。

投稿2016/06/02 03:24

編集2016/06/02 03:27
catsforepaw

総合スコア5938

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

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

bananafish

2016/06/02 06:16

こんなにたくさんの方に答えてもらえるとは思っていなかったのでとてもうれしいです、みなさんありがとうございました。 おかげさまでなんとか概念や使用用途などについてはわかりました、あとは実戦でどんどん慣れていけたらと思います。
catsforepaw

2016/06/02 09:37

> あとは実戦でどんどん慣れていけたらと思います。 それ大事ですね。いろんなプログラムを作って経験を積むことで「こういうときにはああすれば良い」という勘のようなものが身についていくと思います。 頑張ってください。
guest

0

例を示します。
1個しかない定義ファイルを読み込んで定義情報を保持するクラス Config を作ったとします。
シングルトン設計でない場合、Config を次のように使います。

Java

1Config c = new Config(); // Config のコンストラクタで定義ファイルを読み込む 2String name = c.getName(); // 定義されている名前を取得

上記の使い方では、new 演算子を実行するたびに、Config のインスタンスが生成されます。
すると、定義ファイルが1個しかないにも関わらず、Config のインスタンスを生成するたびに、定義ファイルを読み込むことになります。

そこで、次のように Config クラスを改善します。

  1. Config クラスのコンストラクタを public にしないように修正し、

外部プログラムで new 演算子でインスタンスを生成できなくする
0. Config クラスに getInstance() を追加し、
Config 内部で保持しているインスタンスを返す

すると、プログラムでは次のような使い方になります。

Java

1Config c = Config.getInstance(); // 生成済みの Config インスタンスを取得 2String name = c.getName(); // 定義されている名前を取得

この改善により、ただ1つのインスタンスを使いまわすようになります。
そうすれば、定義ファイルを読み込む回数も1回だけになります。

インスタンスを1個しか作らせたくない場合に、シングルトン設計をします。

投稿2016/06/02 02:47

編集2016/06/02 02:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

シングルトンを使わないほうがいいケースもあります。

オブジェクトの状態が更新されるようなクラスはシングルトンにしてはいけないです。

他の方の回答にもあるように、リソースが単一で不変なオブジェクトに対してのみシングルトンを検討するべきです。

更新が必要なオブジェクトをシングルトンにしてしまうと、他のスレッドと更新が競合しないようにsyncronizedなどで排他制御を行う必要が出てきて、オーバヘッドが発生します。

ですので、シングルトンは値オブジェクトであるべきです。シングルトンはメモリ効率がよく、アクセシビリティも高いので便利ですが、なんでもかんでもシングルトンは危険ですのでそこだけ注意してください。

投稿2016/06/07 04:38

sonodar

総合スコア29

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

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

0

例えば山田さんがいたとします。
山田さんは手帳を持っています。手帳にはスケジュールを記入します。
しかし、山田さんがたくさん手帳を持っていたらどうでしょう。
明日のスケジュールは青色の手帳、
明後日のスケジュールは赤色の手帳、
来週のスケジュールは緑色の手帳と、
バラバラの手帳にメモしたとすると、いざスケジュールを確認するとき、どの手帳を見ていいかわかりません。

しかし、手帳が1冊しかなければ、書き込むのも確認するのも1冊を見ればよいことになります。
シングルトンとはそういうことです。

投稿2016/06/02 02:25

masaya_ohashi

総合スコア9206

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

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

0

一人ではなく、複数人がプログラミングしていると考えてください。

例えばAさんがA機能、BさんがB機能を作っていたとします。Cさんはそれぞれで使うクラスを定義しています。
A機能とB機能のそれぞれで使うインスタンスをすべてCさんが作ったクラス定義からインスタンス化したとします。

この時にアプリケーション的に1つしか存在しないインスタンス(OS、ファイルアクセスクラスやDBアクセスクラス等)を各自が自由にインスタンス化し変更すると各インスタンス間で不整合が起きないように同期を取る必要が出てきます。

このような不整合が起きないようにするには難度が高く誤りが起こりやすくなります、そこでCさんがシングルトンパターンを適用しアプリケーション内でインスタンスが1つになるように保証します。1つのインスタンスはどこで値が変更されても不整合が起こり得ないので同期も必要ありません。

投稿2016/06/02 03:12

yona

総合スコア18155

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

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

0

ログ出力などが例になりますかね?
javaなどでは同一ファイルに対するファイル出力のストリームを複数持つことはできません。
だからシステム全体で同一のインスタンスから出力できるようシングルトンで保持する必要が発生するのだと思います。

投稿2016/06/02 02:21

tkturbo

総合スコア5572

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

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

0

インスタンスがなぜ一つじゃないといけないのか

制限として1つしか持てないオブジェクト(A)があり、複数のオブジェクトから
利用したいとすれば、Aを利用する機能はシングルトンとする必要があります。
tkturboさんの回答はこの例です。

オブジェクトの実装の制限により、1つじゃないとダメになることがあります。
例えばインスタンス生成時に何かの処理を行う人がいて、その処理を一回だけ、
実行して欲しいという場合。
「一回しかしないでね!」とお約束するよりも、機能として一回しか実行されない
ことを保証するのが良いのは言わずもがな。
その実現方法として、シングルトンという選択があります。
sipadan2003さんの回答がこの例です。

どのような場面でシングルトンを使うのか

上記の通り、シングルトンじゃないとダメって時は、当然そうします。
他の方法で回避できる場合もありますが、この辺は設計次第です。

他には、あるオブジェクトをみんなが共有して使いたいという時がたまにあります。
全部の機能にオブジェクトの参照を渡すのが大変。ってとき、シングルトンだと楽です。
Cならグローバル変数を使えば共有できますけど、私はシングルトンの方が好きです。

また、なにかしらの理由でスゴイサイズのメモリをアロケートしなければならない等、
オブジェクトのサイズが非常に大きい場合もシングルトンを選ぶことがあるかと思います。
インスタンスがたくさんできるとメモリを圧迫してしまうからですね。

絶対にシングルトンじゃないとダメ!!というのは、どちらかと言えば稀です。
シングルトンは、デザインパターンの一種で、設計時の選択肢の1つです。

投稿2016/06/02 03:29

tnd-.-b

総合スコア247

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

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

0

最近しみじみと必要性を感じたので一言だけ。
データベースを作っていたのですが、AさんからのINSERTはBさんも見れなくてはなりません。
今回作成したのはインメモリDBでしたので、実体がAさん用、Bさん用に出来ては不都合です。
よって単一のリソースを復数人数で参照するにはシングレトンが必須でした。

投稿2016/06/02 03:29

pochi0701

総合スコア210

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問