1

次の 2 つのクラス Example1 と Example2 があり、すべてのパフォーマンス特性を除外すると、これら 2 つのクラスはまったく同じように動作しますか。つまり、methodA または methodB がどれほど単純であるか複雑であるかに関係なく、これら 2 つのクラスをすべての可能な条件 (内部および外部の両方) で実行した結果は常にまったく同じになりますか?

例1

public class Example1
{
    public static void main (String [] args)
    {
        try
        {   
            // this will not compile since nextBoolean() is not static
            // boolean t = java.util.Random.nextBoolean();

            // changed to
            java.util.Random r = new java.util.Random();
        boolean t = r.nextBoolean();

            if (t)
            {
                methodA();
                methodB();
            }
        }
        catch (Throwable t)
        {
            t.printStackTrace(System.out);
        }
    }

    private static void methodB ()
    {
        // code goes here
    }

    private static void methodA ()
    {
        // code goes here
    }
}

例2

public class Example2
{
    public static void main (String [] args)
    {
        try
        {   
            boolean t = java.util.Random.nextBoolean();

            if (t)
            {
                methodA();
            }

            if (t)
            {
                methodB();
            }
        }
        catch (Throwable t)
        {
            t.printStackTrace(System.out);
        }
    }

    private static void methodB ()
    {
        // code goes here
    }

    private static void methodA ()
    {
        // code goes here
    }
}
4

4 に答える 4

4

はい、それらは同じです。基本的に、質問はこれら2つのものが等しいかどうかを尋ねています:

        if (t)
        {
            methodA();
            methodB();
        }

        if (t)
        {
            methodA();
        }

        if (t)
        {
            methodB();
        }

tメソッド呼び出し間で変更できない ため、それらは同じです。

于 2013-07-10T19:41:38.873 に答える
3

はい、同じ出力が生成されます。変数tはメソッドによって変更できないため、実行をmethodA妨げる可能性はありません。methodB

同様に、methodA例外がスローされたmethodB場合、どちらの場合も実行されません。

于 2013-07-10T19:41:58.880 に答える
1

結果が完全に同じであるとは限りませんが、一般的にはそうなるでしょう。具体的には、メイン プログラムのクラス名が実行前に同じにされていたとしても、 と で実行すると異なる結果が得られるmethodAとの実装を作成できます。methodBExample1Example2

これを実現する 1 つの方法は、スタック トレースを生成してから、 を実行するための行番号をイントロスペクトすることです。これはとmethodBでは異なります。Example1Example2

たとえば、以下の methodB を および で実行するExample1と、異なる出力が得られExample2ます。

public static void methodB()
{
    int count = 0;

    StackTraceElement[] elements = Thread.currentThread().getStackTrace();
    for (StackTraceElement element : elements)
    {
        count += element.getLineNumber();
    }

    System.out.println(count);
}

ただし、一般に、スタック トレースやその他の側面に基づくこのタイプのロジックは珍しいため、プログラムは同じ結果をもたらします。

于 2013-07-10T20:44:10.047 に答える
0

それらは同じです。if ステートメントは、2 つのクラスで同じです。

于 2013-07-10T19:44:09.157 に答える