这些java类是等价的吗?

时间:2013-07-10 19:39:17

标签: java class equivalent

给定以下2个类Example1和Example2并排除所有性能特征,这两个类的操作方式是否完全相同。也就是说,无论方法A或方法B是多么简单或复杂,在所有可能的条件(内部和外部)下运行这两个类的结果总是绝对是相同

示例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 个答案:

答案 0 :(得分:4)

是的,他们是一样的。基本上问题是问这两件事是否相等:

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

        if (t)
        {
            methodA();
        }

        if (t)
        {
            methodB();
        }

它们是相同的,因为t在方法调用之间无法更改。

答案 1 :(得分:3)

是的,它们会产生相同的输出。变量t不能被方法更改,因此methodA不可能阻止methodB执行。

同样,如果methodA抛出异常,methodB将不会执行任何一种情况。

答案 2 :(得分:1)

结果保证完全相同,尽管一般情况下都是如此。具体来说,您可以编写methodAmethodB实现,这些实现在Example1Example2中运行时会产生不同的结果,即使主程序的类名是执行前一样。

实现此目的的一种方法是生成堆栈跟踪,然后内省执行methodB的行号,这在Example1Example2中是不同的。

例如,以下方法B在Example1Example2中运行时会产生不同的输出。

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

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

    System.out.println(count);
}

但是,通常程序会产生相同的结果,因为这种基于堆栈跟踪或其他方面的逻辑是不常见的。

答案 3 :(得分:0)

他们是一样的。这两个类中的if语句是相同的。