• ベストアンサー

インスタンスについて

個人的にJavaの勉強を始めた者です。 サンプルのソースをいただいたのですが、質問があります。 package xxxx.xxxxx.xxxxx; import yyyy.yyyy.yyyy; public final class ABC { /** 自クラスのインスタンス private static final ABC  _SELF  = new ABNC(); 中略 } 1.このように、自クラスのインスタンスを作成するのは何故でしょうか? 2.>_SELFのように "_"を先頭につけるのは、理由がるのでしょうか? サンプルを提供してくれた方には月曜まで連絡がとれません。 Javaのエキスパートの皆さん、よろしくお願いします。

  • buck
  • お礼率83% (627/748)
  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

これだけでは分からないけど、シングルトンというクラスのインスタンスを一つだけにする手法かな。コンストラクタがprivateなら間違いなくこれですね。クラスの外からはインスタンスを作れない。 変数名の先頭をアンダースコア(_)にするのはC言語などだとライブラリ等で使う変数名ですね。アプリケーションが使う名前と衝突しないようにそういうルールがある。Javaでは良くない(標準的な命名規則に合わない)使い方だと思う。

buck
質問者

お礼

回答ありがとうございました。 勉強になりました。

その他の回答 (1)

回答No.2

シングルトンではオブジェクトのインスタンスを 複数生成してしまうことを制限できます。 中略のところのメソッドに以下のようなメソッドが あるかもしれません。 public ABC getInstance( ){ return _SELF; } このようなつくりにしておくとクライアント側では newでインスタンスを生成するのではなく、クラスが 保持する唯一のインスタンスを返すことになります。 abc = abc.create( ); //←つねに_SELFがかえるので abc = abc.create( ); // 同じです ---- 適用しない場合は abc = new ABC(); //インスタンス作成でも abc = new ABC(); //別ものになります わかりますか? _が付いている件は命名規則ですね。 開発者間での約束を規定したものです 定数の場合は英語大文字とかいう取り決めに過ぎません。

buck
質問者

お礼

回答ありがとうございました。 勉強になりました。

関連するQ&A

  • クラス、インスタンスメソッドについて

    JAVA初心者です。 現在、先人が作ったプログラムの修正作業を行っておりますが、 以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。) あるクラスが以下の様になっております。 public class Sample { private static Sample s = new Sample(); private Sample() { } /** クラスメンバに存在するインスタンス取得 * @return Sampleクラスの唯一のインスタンス */ public static Sample getInstance(){ return s; } public static void methodA(){ ... } } でこのmethodAを使用するには、以下の様にします。 Sample.getInstance().methodA() これはこれで納得で、うまく動作しますが、これは 結局の所、クラスメソッドにしたかったという事ではないのかな?と 疑問に感じています。つまり、単純に Sample.methodA と呼び出せばうまくいきます。 ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり getInstanceというものが存在し、現在日時を取得するのに Calendar.getInstance().getTime() の様に呼び出すと書いてありました。 Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが) のこれらのgetInstanceの効用とはなんなんでしょうか? ・クラスの外でnewでインスタンスを作り出さない所 ・それでいてクラスメソッドではない(?)所 この辺りについてご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • Systemクラスはインスタンスが作れない?

    初歩的な質問ですみませんが、、、 JAVAのSystemクラスはなぜインスタンス化できないのでしょうか?final classだから継承はできないとは聞いたことがありますが。。。

    • ベストアンサー
    • Java
  • マルチプルインスタンスのメリット

    100%の自信をもって回答できる方のみ回答をお願いします。 Java等のオブジェクト指向プログラミング技術において、クラスからインスタンスを たくさん作れるというのが特徴の一つとなっていますが、クラスからインスタンスを たくさんつくれるメリットはなんでしょうか。 クラスからインスタンスをたくさん作れなくても、1つ作れば動くプログラムはたくさんありますし、 そういうプログラムであれば、staticなアクセスにすればよいですよね。 クラスからインスタンスがつくれることを説明した本やサイトは山ほどありますが、 インスタンスがたくさん作れることのメリットを説明した本をみたことがなく、 「なぜオブジェクト指向でつくるのか」という本を買って読みましたが、 納得がいくメリットを感じられませんでした。 また世の中のソースをみると、みんな、すぐにクラスを作ってオブジェクトを作っていますが、 みなさんがどうして、オブジェクトを作らなくてもコーディングできるケースのプログラムを オブジェクトを作るのか不思議でしかたありません。 どうしてオブジェクトを作らなくてもいいケースでもオブジェクトを作るのか、 またたくさんオブジェクトを作れるメリットはなんなのか、教えてください。

  • クラス内で自分自身をインスタンス化

    javaで開発をしております。 あるソースコードに、クラス内のメソッドで自分自身をインスタンス化しているものを見ました。初めて見たのですが、どういった場合に使われるのでしょうか。 public class Sample { public Sample hoge() { Sample sa = new Sample(); //何らかの処理 return sa; } }

    • ベストアンサー
    • Java
  • クラスとインスタンスについて

    はじめまして。Javaをはじめて3か月の超初心者です。 早速ではございますが、質問をさせていただきます。 以下のサンプルで、 class Foo { private int i = 0; Foo(int i) { this.i = i; } void func1() { System.out.println(this.i); } void func2(Foo foo) { System.out.println(foo.i); } } class Main { public static void main(String[] args) { Foo obj1 = new Foo(100); Foo obj2 = new Foo(500); obj1.func1(); obj1.func2(obj2); } } privateフィールドのスコープは同一クラス内からしか アクセスできないと参考書には記述されているの ですが、そのクラス内に上のサンプルのように this.iやfoo.iというように、クラスは同じでも インスタンスが異なるものがiにアクセスするとき、 上のサンプルは、どちらもアクセス制限のエラーが表 示されません。なぜなのでしょうか? this.iというアクセスは、現在実行中のインスタン ス内でのアクセスなので、privateスコープ内での アクセスであるというような感じがするのですが、 foo.iというアクセスの方は、現在実行中のインスタンスとは異なるインスタンス内でのアクセスなので、 privateスコープからはずれているような感じがして なりません。

    • ベストアンサー
    • Java
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Runnableのインスタンス化について

    下記のコードについてです。 Runnableがインスタンス化されていますが、 どうしてそれが可能なのかが分かりません。 分からない点は 1.Runnableはインタフェースであるから、本来、直接インスタンス化は不可能であるはず。 2.しかし、Runnableはクラスライブラリjava.langパッケージに含まれている。 だからインスタンス化は可能なのかもしれない。 3.あるいは、下記のコードではメソッド内の無名クラスであるから、「new Runnable(){」の 部分でスーパークラスとしてのRunnableを継承したサブクラスを生成しているのかもしれない。 アドバイスをよろしくお願い致します。 public class Main{ public static void main(String[]args){ Runnable task = new Runnable(){ public void run(){ System.out.println("run"); } }; Thread thread = new Thread(task){ public synchronized void start(){ System.out.println("start"); } }; thread.start(); } }

    • ベストアンサー
    • Java
  • クラス名はどうするのですか?

    package ex7; public class Sample { public final static int VALUE = 100; } package ex7; import static ex7.Sample.VALUE; public class Main { private final static int VALUE = 0; public static void main(String[] args) { System.out.println(VALUE); } } 上記のプログラムのクラス名は何をつければいいですか・・・? 同じくプログラム名は何と付ければいいですか・・・? ご多忙中恐れいります・・・。 ご回答の程宜しくお願い申し上げます。 回答者 これが、素人さんには分かりにくいんですね。 mkdir ex7 で、ex7 というディレクトリを作製して、 その中に、 Sample.java を public class Sample { public final static int VALUE = 100; } で、 Main.java を package ex7; import static ex7.Sample.VALUE; public class Main { private final static int VALUE = 0; public static void main(String[] args) { System.out.println(VALUE); } } で作製して、 ex7 の中から出て、 javac ex7/Sample.java javac ex7/Main.java でコンパイルします。 質問者 度々すいません・・・。 ファイル名は何にすればいいですか・・・? ご回答がなかなか来ません。

    • ベストアンサー
    • Java
  • インスタンスNameを文字列で表現するには?

    Object State; public static final Object PLAY=new Object(); public static final Object STOP=new Object(); Sateを操作するメソッド(); : : System.out.println(Object.Stateの文字列表現); としたいのですが、ObjectインスタンスであるPLAYやSTOPをprintlnメソッドで文字列として表現させるにはどうすればいいのでしょうか?コンソールにPLAY,STOPと表示させたいのですが、そのままprintln(State)とすると訳の分からない文字(→java.lang.Object@239137)が出てきます。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Pythonのコードself多すぎ読み書きしにくい

    Pythonのクラスには通常class:宣言行直下で作成する「クラス変数」と、__init__()メソッド内で作成するかインスタンス作成後にインスタンス名.変数名で追加作成する「インスタンス変数」があります。 Pythonのクラス変数はJavaのクラスでstatic修飾子を付けて宣言したクラス変数と同じで、そのクラスから作成されたインスタンス全てに同じメモリーを割り当てます。 Pythonのインスタンス変数はインスタンスごとにメモリーが割り当てられるので、Javaの普通の変数(フィールド)のように同一クラス内のすべてのメソッドから参照できますが、参照するたびにいちいち「self.」を付けないといけません。 (例 かなり恣意的ですが。。。インデントはOKWAVEが取ってしまうかもしれせん) class Sample: def __init__(self): self.L = [] # Lは数値のリスト def setList(self, L): self.L = L def exe(self, i1, i2): # L[i1]>0かつL[i2]>0のとき、大きい方から小さい方を引いた # 値に、大きい方を小さい方で累乗した値を加える if self.L[i1] > 0 and self.L[i2]: if self.L[i1] > self.L[i2]: return (self.L[i1] - self.L[i2]) + self.L[i1] ** self.L[i2] else: return (self.L[i2] - self.L[i1]) + self.L[i2] ** self.L[i1] イテレーターを使て同じ処理をループする場合はいいのですが、ループで処理できない複雑な処理が続く場合はこのように「self」だらけになり、コーディングミスが多発し、コードが読みにくいものになります。 「self」を省略してインスタンス変数をメソッドから参照し、コードを読みやすいものにする手段はないのでしょうか? どうぞよろしくお願いします。

専門家に質問してみよう