2

私はC#開発者であり、同じ宣言ステートメントで変数を初期化することに慣れています。

ClassA myClass = new ClassA();

私の見解では、この方法は簡潔で読みやすく、見た目もすっきりしています。

今、私はアンドロイドのためのジャバを学んでいます。これまでのところ、私が直面しているJavaスニペットが何であれ、スニペットライターが次のようなコードを使用していることがわかります。

ClassA myClass;
myClass = new ClassA();

さて、私の質問はばかげているように聞こえるかもしれませんが、本当に知りたいのですが、影響/効果はありますか、それともこれら2つのアプローチの間に違いはありますか?つまり、次のようにJavaでコードをコンパイルすると:

ClassA myClass = new ClassA();

内部的に重要なことはありますか?何も悪いことをしていないことを確認したいだけです。

4

5 に答える 5

7

いいえ、これはC#/ Javaの違いではなく、あなたの習慣は適切です。if初期化が条件付き( / )であるために必要な場合を除いて、宣言と初期化を分割する正当な理由はありませんelse

悪いC#がたくさんあるのと同じように、適切に記述されAndroidコードもたくさんあると思います。運が悪かったようです(または、不幸なスタイルの同じ作者によるコードをたくさん読んでいる可能性があります)。

于 2012-07-16T08:23:50.447 に答える
1

見たスニペットはわかりませんが、それを妨げるものは何もありません。

ClassA myClass = new ClassA();

違いは、JavaではC#のように例外を無視できないため、多くの場合、次のようなものがあります。

try{
 ClassA myClass = new ClassA();
}
catch(Exception e)
{
}

その場合、tryブロックの外でmyClass変数を使用する場合は、tryブロックの外で定義し、tryで初期化する必要があります。

ClassA myClass = null;

  try{
     myClass = new ClassA();
    }
    catch(Exception e)
    {
    }
    if(myClass != null){
        myClass.doSomething();
    }
于 2012-07-16T08:28:22.947 に答える
1

どちらのアプローチも有効であり、構築時に変数の初期化を停止することはできません。

2番目のアプローチでは、必要なときにオンデマンドでオブジェクトを作成します。

パラメータ化されたコンストラクターがある場合。

ClassA myClass = new ClassA(xyz);

上記のアプローチでは、デフォルトオブジェクトを使用して参照を作成します。

ClassA myClass;

//    some condition 
 myClass=new ClassA(abc);
// some other

 myClass=new ClassA(xyz);
于 2012-07-16T08:25:29.837 に答える
0

ClassA myClass;

この時点で、「new」キーワードを呼び出すまで、新しいJavaオブジェクトは作成されません。ただし、重要なのは、変数がグローバルである場合は、直接宣言を使用しないでください。

于 2012-07-16T08:30:02.383 に答える
0

それが作るかもしれない唯一の「違い」は、myClassがtry-catchブロックで使用されるときです。

ClassA myClass;

try {
    myClass = new ClassA(); // exception may occur here
} catch {
    // catch and process exception
} finally {
    // always do something
}

doSomethingWith(myClass);

tryブロックで宣言して初期化すると、外部には表示されません。
それが私のPOV、ATMからそうする唯一の理由です。

于 2012-07-16T08:30:50.760 に答える