2016-08-10 6 views
0

このコードはJavaでは安全ですか?メソッド内でインスタンス化される変数のスコープ - Java

public class HelloWorld { 

    public static void main (String args[]) { 
     HelloWorld h = new HelloWorld(); 
     int y = h.getNumber(5); 
     int z = h.getNumber (6); 
     if (y == 10) 
      System.out.println("true"); 
    } 

    public int getNumber(int x) { 
     int number = 5; 
     number = number + x; 
     return number; 
    } 

} 

私の同僚は、int型の数がスタックに置かれるとはgetNumberが戻ったとき、それがポップされ、潜在的に上書きすることができることを述べています。

Cで同じコードが潜在的に危険ですか?

+6

はい、問題ありません。なぜこれが安全でないのかを説明するように同僚に依頼してください。多分あなたは私たちと分かち合うことができます。 – sstan

+3

_scope_を実行時に発生するものと混同しないでください。 _Scope_はソースコード内で識別子を使用できる場所を定義するコンパイル時の概念です。 –

+3

あなたの同僚は間違っています。 – sstan

答えて

0

HelloWorldクラスはフィールドを持たないため、不変です。 getNumber(x)関数は、任意のスレッドから同じオブジェクトを使用して何度でも呼び出すことができ、同じ引数に対して常に同じ結果が得られます。

あなたの同僚は、恐らくあなたがstatic int numberのような何かを持つことができる恐ろしい話を思い出しています。これはメソッドに属し、上書きされます。あるいは、彼女は「参考文献」について考えているかもしれません。たとえそれがあったとしても、毎回新しいメソッドを呼び出すことになります。numberはすべてのメソッド呼び出しで新たにインスタンス化されるためです。

-2

あなたの同僚は間違いありませんが、明らかに何が起こっているのか誤解しています。

public int getNumber(int x) { 
     int number = 5; 
     number = number + x; 
     return number; 
    } 

はい5 + 5,5 + 6の値がスタックに配置され、それらが上書きされるおそれがない、それらが適切にYまたはZの中に配置されます。

私は混乱がCからであると思われます(このタイプコードはCでもうまく機能します)が、プリミティブの代わりにポインタのためです。 C内の関数からmallocの結果を返すことは、正しく行っていないと「挑戦する」ことができます。

+1

JITの後では、 'number'がスタック上の値として存在することはほとんどありません。操作全体はスタックではなくレジスタで実行される可能性が高いです。メソッドがJITによってインラインになると、パラメータと戻り値もスタック上の値として消えます。結論:同僚はあらゆる面で間違っています。 – Andreas

+0

これはVM内部の知識を前提としています。 asembler型レベルのJVMはスタックベースです。レジスタやスタック上にある場合は、実際には問題ありません。重要なことは、値がゴミ箱に入れられないことです。 – TofuBeer

関連する問題