• ベストアンサー

ローカル変数の初期化方法の違い

thamansaの回答

  • thamansa
  • ベストアンサー率40% (95/232)
回答No.2

コンストラクタのオーバーロードがあるときに、ソースコードのメンテナンス性などに違いが出てきます。 class Foo{   private String text;   public Foo(){     text = "aaa";   }   public Foo(int num){     text = "aaa";   } } 同じ値で初期化するコードが複数存在しているのは、一般に悪い実装とされます。 修正案1 class Foo{   private String text = "aaa";   public Foo(){   }   public Foo(int num){   } } 修正案2 class Foo{   private String text;   public Foo(){     text = "aaa";   }   public Foo(int num){     this();   } } 案1と案2を単純に見比べると1のほうがすっきりしていますが、実際のクラスではnumの初期化があったり、textの初期値もコンストラクタで受け取る場合があったりするので、その結果 this() を使うほうが最適だったりします。

pe_daichan
質問者

お礼

ご回答ありがとうございます。 そういえばオーバーロードがある時も、扱いが変わってきますね。納得です。

関連するQ&A

  • デバッグ中の変数参照について

    VS2005のC++/CLIでアプリを作っているものです。 デバッグ中に作成したメソッドの引数に渡されて来る値をウォッチで 見ようとすると「エラー: 識別子 'str' はスコープ外です」となり 中身が見れません。 作成したクラスのメンバ変数は見れます。 以下が発生したソースです。 ---------------------------- TestClass.cpp ---------------------------- #include "StdAfx.h" #include "TestClass.h" using namespace System; TestClass::TestClass(void) { } // 追加メソッド void TestClass::func( String^ str ){ String^ tmp; tmp = str; } ---------------------------- TestClass.h ---------------------------- #pragma once using namespace System; ref class TestClass { public: TestClass(void); // 追加メソッド void func( String^ ); }; ---------------------------- Form1.h ---------------------------- #pragma once #include "TestClass.h" namespace test2 { (省略) public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // TestClass^ aaa = gcnew TestClass(); aaa->func( "あいうえお" ); } (省略) ---------------------------- プロジェクトは、CLRのWindowsフォームアプリケーションで作成しています。 初心者の質問ですが、宜しくお願い致します。

  • 動的に変数をセット後他クラスから参照する場合

    コンストラクタで変数にセットした後 他のクラスでインスタンスを生成することなく セットした変数を参照したいのですが、 staticにすると、他クラスで変数を変更することも できてしまいます。他の方法がありますでしょうか? 変数はprivateにして、getterで取得するという方法も 考えられますが、static finalな変数として扱う方法が あるか、お分かりの方いらっしゃいましたら教えてください。 Javaを初めて1ヶ月なので、見当違いの質問でしたらご指摘ください。 例) Class A{  static final String aaa; A(String paraStr){ aaa = paraStr; } } Class B{ static void main(String[] args){ new A("test"); } } Class C{ void chStr(){ System.out.println(A.aaa); A.aaa = "changeStr" System.out.println(A.aaa); } } 期待する値 test test もしくは、実行時にfinalの値は変更できない等のException 宜しくお願いします。

    • ベストアンサー
    • Java
  • エラーの理由が分りません。Private' であるため…?

    データを構造体で管理したいと思って、class testclassというクラスを作成しました。 それをtest2clsssで使うと思っているのですが、次のようなエラーが出ます 'testclass.code' は 'Private' であるため、このコンテキストではアクセスできません。 ソースは次のようなものです。 Public Class testclass Dim code As String End Class Public Class test2class Private Sub testsub() Dim test As New testclass test.code = "data" '←test.codeが駄目と言われる End Sub End Class subをPublicにしても同じエラーが出ています。 エラーの意味・原因は何で、どうすれば修正できるのでしょうか? よろしくお願いします。

  • サーブレッドでのローカル変数はスレッドセーフだと聞きましたが、

    サーブレッドでのローカル変数はスレッドセーフだと聞きましたが、 オブジェクト型のローカル変数にもそれは当てはまるのでしょうか。 例えば下記の実行クラスにユーザAとユーザBが同時にアクセスした場合、どうなるのでしょうか。 手順 (1)ユーザAが実行クラスのtestMethodを実行し、TestBean.setNameメソッドで名前をセットする (2)その直後にユーザBがtestMethodを実行し、TestBean.setNameメソッドで名前をセットする (3)ユーザAがセットした名前はユーザBに上書きされてしまうのか? ------------------------------------------------- ○実行クラス public class TestClass{   public String testMethod(){     TestBean testBean = new TestBean();     testBean.setName("テスト太郎");     return testBean;   } } ------------------------------------------------- ○呼び出されるBeanクラス public class TestBean{   private String name = null;     public void setName(String name){     this.name = name;   } } ------------------------------------------------- わかり難い説明で申し訳ないのですが、教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • 既存のクラスをソートする方法

    下記のようなクラスがありこのクラスのソートを したいのですが、具体的にどのようにすればよいのでしょうか? 調べてみると、Comparatorインタフェースを継承すればソートできるようなのですが、あまり既存のクラスを変更 したくありません。クラスを変更せずにソートする方法 はあるのでしょうか? public class TestClass{ private String[] cbSelItem; private String[] hdSelItemFlg; public String[] getCbSelItem() { return cbSelItem; } public void setCbSelItem(String[] cbSelItem) { this.cbSelItem = cbSelItem; } public String[] getHdSelItemFlg() { return hdSelItemFlg; } public void setHdSelItemFlg(String hdSelItemFlg[]) { this.hdSelItemFlg = hdSelItemFlg; } }

    • ベストアンサー
    • Java
  • クラスオブジェクトの配列化

    C言語初心者です。 C++にて、クラスオブジェクトを配列化して使用したいと考えております。(イメージは下記のような定義になります。) しかし、実際にコンパイルしてみると、エラーとなってしまいます。 根本的になにかおかしいようです。 ■testMng.h #include "testClass.h" class testMng{  private: static testClass aa[10]; public:   testMng();   ~testMng(); } ■testClass.h class testClass{ private: static int iCnt; public: testClass(); ~testClass(); } Cygwin環境にて、gccコンパイラで行っておりますが、 上記のtestMng.hで定義しているtestClassオブジェクトを、 配列化せずに、testClass aa;とすれば、問題なくコンパイルできるのですが、何がわるいのかわかりません。 そもそも、配列化自体が無理なのでしょうか? 要因がありそうであればご教授お願いいたします。

  • Inherits EventArgsの初期化

    Public Class TestEventArgs : Inherits EventArgs   Public aaa As Date   Public bbb As String End Class aaaとbbbをいろいろなところで使用するので、aaaとbbbを初期化したいのですが、 VB.Netではどうしたらよいのでしょうか? 単純にbbb = ""で良いのでしょうか?

  • classファイル内の変数名について

    2つのclassファイルをそれぞれ逆コンパイルして内容を確認したところ、 以下のように、それらしい変数名と機械的に振られたような変数名になっていました。 ・A.class → A.java  String atai = "aaa"; ← 元のプログラムと同じ変数名(atai)   ・B.class → B.java  Stinrg s1 = "aaa"; ← 機械的に振られている変数名(s1) コンパイル方法の違いで変数名が機械的になってしまうことがあるのでしょうか。 作業担当者が居なくなってしまって、当時の状況を確認することができません。 多分、同じソースファイルのはずなのですが、本当に同じ内容なのか 比較したいのに、微妙な違いがあるため比較ができなくて困っています。 引数も微妙に違っているようなので、それらしい変数名か機械的なものか どちらかに統一させてデコンパイルする方法があったら教えてください。 また原因も知りたいです。 アドバイスをお願いします。

    • ベストアンサー
    • Java
  • Stringのコピーについて教えてください。

    いつも、お世話になってます。 現在、VisualC++.NET(Managed)でプログラミングしているのですが 下記のコード(敬略)でString値がコピーできません。 public class aaa{ private: String *str = S"AAA"; public : GetAAA( String *cp ){ cp = String::Copy( str ); } } class main{ String *getter; aaa::GetAAA( getter ); } getterに"AAA"が入っていることを期待していたのですが デバッグすると何も入っていませんでした。 原因がわからないので、教えてください。(ガベコレ?) あと分かるようでしたら対処法もお願いします。 <(__)>

  • VB2008で構造体を引数とした時にエラー

    VB2008の勉強を始めて数週間の初心者です。 勉強用にいろいろとプログラムを作っているのですが、 構造体(Structure)を引数で渡して戻り値を取得する Functionを作成してみました。 同一クラス内のPrivate Function の場合は問題ないのですいが、 追加した別クラスに Function を作成したところ 「 型 'TEST_A.Form1.str_IN' の値を 'TEST_A.Class1.str_IN' に変換できません。」 のエラーが表示されてしまいます。 別クラスのFunctionを使用する時、引数には構造体は指定できないのでしょうか? なにか文法上の誤りがあるのでしょうか? 初心者なので変な質問してたらスイマセン。 詳しい方がいらっしゃいましたらよろしくお願いします。 ------------------------------------------------------ Public Class Form1  Public Structure str_IN   Public in_aaa As String  End Structure  Private Sub Button1_Click(ByVal sender As System.Object,  ByVal e As System.EventArgs) ~   Dim stin As New str_IN   '------------------------------------   stin.in_aaa = "aaa"   Label1.Text = Test_Sub(stin) '<------- これはok   '-------------------------------------   Dim cls = New Class1   stin.in_aaa = "aaa"   Label1.Text = cls.CFnk(stin) '<----- エラーになる  End Sub  Private Function Test_Sub(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class ------------------------------------------------------------ Public Class Class1 '新たに作成したクラス  Public Structure str_IN   Public in_aaa As String  End Structure  Public Function CFnk(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class