• ベストアンサー

コンストラクタとonCreateどちらがベストか

R_Earlの回答

  • ベストアンサー
  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.2

ANo.1です。 > でも再びonCreateが呼ばれるということはアクティビティクラスのインスタンスも2回呼ばれるのではないでしょうか? > メモリ不足で強制終了する場合はGCでアクティビティのインスタンスも破棄される可能性があるという意味でですが。 > そうなると再度onCreateが呼ばれるときにアクティビティのインスタンスが生成されたときにコンストラクタが呼ばれますよね? そうなっている可能性があったので、ANo.1の回答内容に確信が無かったんです。 色々と試してみたのですが、結局同一のインスタンスが 2回onCreateを呼ぶ状況を作る事ができませんでした。 そこで公式のドキュメントを読んでみたのですが、 どうやら2回目にonCreateが呼ばれる場合は、 以前のアクティビティのインスタンスが破棄されており、 新しいインスタンスを生成してonCreateを呼んでいるようです。 http://developer.android.com/guide/topics/fundamentals/activities.html なので現在日時の取得は、onCreateとコンストラクタの どちらでやっても大して変わらない事になりますね。

mail1
質問者

お礼

なるほど!そういうことだったんですね。 わざわざ詳しく調べていただいてありがとうございました! 今後英語ドキュメントも読めるように頑張ります・・・

関連するQ&A

  • 計算してからコンストラクタに渡すか

    メインクラスAからクラスBをインスタンス化します。 Bクラスが持つ変数Cには1~100までの数値がランダムで入ります。 ここで、AクラスであらかじめCを計算しておいてBクラスのコンストラクタに引数として渡すのか それともAクラスではBクラスを生成するだけで、 Bクラスのコンストラクタ内で変数Cの値を計算するのか どちらが良いでしょうか? お教えください。

    • ベストアンサー
    • Java
  • C++、クラスメンバの構造体配列の初期化について

    クラスのメンバに構造体の配列を持っていて、その構造体はfloat値を4つ持ってます。 私はいつもメンバ変数の初期化はコンストラクタでしています。 クラス生成時に全てのfloatを0で初期化したいのですが、これはコンストラクタでfor文を回すしかないのでしょうか? 一文で初期化することは出来ないのでしょうか? 話は少し変わってしまいますが、今思ったのですがコンストラクタで値を決めるのは初期化じゃなくて代入と呼ぶのですかね? ご助力よろしくお願いします。

  • C++変数宣言時のコンストラクタについて

    Java開発をこれまでやってきたのですが、 C++を学ぼうとしています。 C++では下記のように宣言した場合hogeは インスタンスになり、Hogeクラスのコンストラクタが呼ばれるようなのですが、 Hoge hoge; Hogeクラスのコンストラクタが下記のような引数を持つものしか定義されていなかった場合は どの様な振る舞いをするのでしょうか? Hoge(int num); Javaでは引数の有るコンストラクタしか宣言しなかった場合はデフォルトコンストラクタは 作られなかったと思うのですが、c++では引数のないデフォルトコンストラクタができてるのでしょうか? また、デフォルトコンストラクタが出来ていなかった場合、 Hoge hoge; というようにプリミティブ型のような変数宣言の仕方で引数有りのコンストラクタを呼ぶことは出来るのでしょうか?

  • クラスについての質問

    私はゲームを作っています。作り始めのころクラスの存在を知らずに めちゃくちゃに組んでいたのですが、最近になってクラスを使わないと 不便だという事に気が付きました。現在クラスを使用して修正中です。 クラスについて調べている時に、クラスの中のメンバの値を変える時は そのクラスの中でしか変えてはいけない、ととあるサイトで見かけました。 更にクラスのメンバはなるべくpublicで宣言してはいけないとも見かけました。 そこで気になったのですが、クラスの中のメンバの値をクラス外の 変数やクラスのメンバ等に代入したい時はどのようにすれば良いのでしょうか? クラス外でメンバを参照するにはpublicで宣言しなければなりませんし、 クラス内に変数をアドレスで引き渡して代入してしまうと、クラス内でしか 値を変えてはいけないということを守れなくなってしまいます。 このような場合はどのようにして値を代入すれば良いのでしょうか? 返答をお願いします!。

  • PHP5 コンストラクタや初期化の意味がわからない

    プログラミング初心者です。本を参考にしてPHPを勉強しています。 クラスの章でコンストラクタについて以下のように書かれていました。 コンストラクタはインスタンス化のタイミングで実行されるという性質上、 プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化 といった処理を記述するのが一般的です。 初期化処理が不要な場合、コンストラクタは省略可能。 ここで質問です。 インスタンス化を行うのは初期化するためということでしょうか? 「~といった処理を記述するのが一般的」ということは、初期化が 本来の目的ではないという意味にもとれますがどうなんでしょうか。 また静的メソッドについては、 「インスタンス化を行わなくても利用できるメソッド」 と書かれていましたが、何がどう違うのか分かりません。 初期化とは何でしょうか?またなぜ初期化を行うのでしょうか? 静的メソッドと何が違うのでしょうか?

    • ベストアンサー
    • PHP
  • コンストラクタ・デストラクタ

    プログラミング言語はC++ C++を触り始めたばかりの素人です。 コンストラクタとデストラクタについて質問です。 下記に参考にしているウェブページから簡潔にしてコードを書いてみました。 コンストラクタ、デストラクタの中はそれぞれに、○○が呼び出されましたと書いてあるだけでよく分からなかったので別のウェブページを見たら コンストラクタは Sample::Sample(){ n=0; } みたいな例があったのですが、このように変数に予め何かの値を代入しておくという事で合ってますか? デストラクタは理解できていません。 下記の例では、どのような処理を書けばいいのでしょうか? #include<iostream> using namespace std; class Sample { private: int n; public: void Show(); Sample(); ~Sample(); }; void Sample::Show() { cout << n << endl; } Sample::Sample() { // n=0; std::cout << "コンストラクタが呼び出されました" << std::endl; } Sample::~Sample() { // どんな処理? std::cout << "デストラクタが呼び出されました" << endl; } main() { Sample sample; sample.Show(); return 0; } 実行結果 コンストラクタが呼び出されました 1     ←コンストラクタ関数内の//を削除で0になることは確認 デストラクタが呼び出されました

  • C++、コンストラクタの引数の数を可変にしたい

    次のようなプログラムを作ろうとしています。 あるクラスComponentは DIM(整数)次元(要素数)のdouble型配列と ここで DIM は別のところでconstで宣言されています。 (他にもいくつか変数を持っているのですが話に関係ないので割愛します) とりあえずこんな感じにしたいです。 class Component{ public: double x[DIM]; Component(double x,double y,double z, ,,,,,); //コンストラクタ } ここでコンストラクタComponentは引数にDIM個の実数をとり、たとえば DIM = 3のとき Component obj(1.0,2.0,3.0); と宣言したら obj.x[0]=1.0 obj.x[1]=2.0 obj.x[2]=3.0 となるようにしたいのです。 むろん代入すること自体は代入すればよいのですが 外で宣言されているDIMによってコンストラクタの引数の数が変わってしまいます。 こういう時はどのような解決策があるでしょうか。 今書いたのと全然違うやり方でもかまいません。 (ただ何個も何個もコンストラクタをオーバーロードするのは避けたいです。 いろんなDIM次元で実験がしたく、きりがありません)。 よろしくお願いいたします!

  • コンストラクタとその類似の形について 初心者です。

    コンストラクタについて勉強したばかりのところ、似たような記述に出会い違いが全くわかりません。 プログラム1 class Book { int price; int num = 0; String title; Book(String t, int p) { ...☆ title = t; price = p; } ・      ・       ・ プログラム2 class Cat { String name; String place; int age; void setData(String n, String p, int a) {...★ name = n; place = p; age = a; }      ・      ・      ・ ☆と★の違いがわかりません。どちらも値(変数)を代入してるという点では同じですよね。なぜ★はvoidがつくのに☆はつかないのでしょうか? 本によると☆のほうはコンストラクタで、★はコンストラクタではなくメソッドらしいのですが・・・。使い分けはどういうときするのでしょうか?  よろしくお願いします。

    • ベストアンサー
    • Java
  • コンストラクターの引数が多い

    Javaにオブジェクトとかインスタンスってあるじゃん。これを作るときの文法は決まっていて、 new コンストラクター(型 引数,型 引数,・・・); です。 ただ、モノには色々な属性(メタデータ、フィールド)があります。多いと数百数千のメタデータがあるでしょうし、今はビッグデータの時代ですから、数万数億の属性があるのかもしれません。この属性はコンストラクターの引数に相当すると思いますが、オブジェクト生成時にコンストラクター書いて引数を代入していくのでしょうか? ///// class T図書 { String タイトル,出版社,著者,用紙サイズ; int ページ数,販売額,印刷費用,重量mg,総文字数,初回発行部数,表紙の厚さmm; java.util.Calendar 発行年月日,作成年月日,構想年月日,認可年月日; T図書( String タイトル, String 出版社, String 著者, String 用紙サイズ, int ページ数, int 販売額, int 印刷費用, int 重量mg, int 総文字数, int 初回発行部数, int 表紙の厚さmm, java.util.Calendar 発行年月日, java.util.Calendar 作成年月日, java.util.Calendar 構想年月日, java.util.Calendar 認可年月日){} } class H発行{public static void main(String[] args){ java.util.Calendar h1821_11_4=java.util.Calendar.getInstance(); h1821_11_4.set(1821,11,4);//(日付セット繰り返し中略) new T図書("白い巨塔","新潮出版社","山崎豊子","A5", 345,2000,60,716,34569,20000,7, h1821_11_4,h1823_11_4,h1820_1_4,h1821_10_4); }} ///// この例だと15個です。許容範囲といえばそれまでですが、どこか違和感を感じております。そして、薬がクラスで、具体的な薬品がオブジェクトで、成分含有量がフィールドだとすると、コンストラクターの引数が莫大になると思う。 薬 ai00kity=new 錠剤薬(リプナビックスX,0,0,0,12,776,98.45,54,・・・・・); こんな感じ?

  • 【C#】クラスのコンストラクタ引数参照渡しでエラー

    C#の.NETでWindowsアプリを作成しております。 C++/CLI経験はありますが、C#は全くの素人です。 AクラスからBクラスに、Cクラスを参照渡しで渡し、 BクラスにてCクラスのメンバ変数の値を書き換えた後、 Aクラスでその値を使用するといったプログラムを作成しようと思っています。 Bクラスを生成する際に、コンストラクタの引数渡しにて、 Cクラスを渡す書き方をしたのですが、下記エラー エラー CS0051: アクセシビリティに一貫性がありません。 パラメータの型 'ref Test.C' のアクセシビリティは メソッド 'Test.B.B(ref Test.C)' よりも低く設定されています。 が発生してしまい、解決法が分かりません。 何か根本的なことが間違っているのでしょうか。。 解決策をご存知の方おられましたら、ご教示お願い致します。 下記にサンプルコードを記載します。 【Aクラス】 B b = new B( C c ); 【Bクラス】 namespace Test { public partial class B : Form { public B(ref C c) // コンストラクタ { InitializeComponent(); } } } 【Cクラス】 namespace Test { class C { public int hoge; } }