6

case1、case2 和 case3 之间有什么区别吗?是否有与性能相关的优势或劣势?

public class Test {

private String name;

    public void action (){

        name = doSome(); // case 1
        setName(doSome()); // case2
        this.name =doSome(); // case3

    }


    public String doSome(){
            return "Hello";
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }


    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
}
4

4 回答 4

3

使用 Eclipse 上的调试和断点来查看每个案例需要多少个步骤。越少越好。

Case 1迈出了 1 步

Case 2采取了 2 个步骤

Case 3= 与Case 1

Case 1Case 3与关键字相同,this只是指当前类。

于 2013-04-08T06:13:17.147 回答
3

我想,在情况 2 中,我们在堆栈上添加了一个额外的方法,即 setName。但是从性能的角度来看,增益几乎可以忽略不计。所以在我看来,在这个示例中,我们应该从代码维护和可读性的角度考虑视野大于性能。

于 2013-04-08T06:15:11.347 回答
0

案例 1 和 3 将产生相同的代码(除非它们是不同的“名称”)。第二个将有一个额外的函数调用,它可能会或可能不会被 JIT 优化掉。但是,这不是您应该注意的缺点。

于 2013-04-08T06:15:26.567 回答
0

我更喜欢案例 2,因为在案例 1 中,如果将来某个时候name引入了局部变量,那么阅读您的代码的人会混淆它所引用的变量。

在案例 3 中,尽管范围更清晰,但不使用 setter 的事实意味着如果将来某个时候您更改了 name 字段的设置方式(例如:您想要修剪空白),您必须更改所有修改过的代码name 变量,而如果你在任何地方都使用 case 2,你只需要更新 setter 方法。

在我看来,一个健康的企业软件开发应该随着错误的发现和业务需求的不断变化而不断地重构代码,因此案例 2 将在这里为您提供优势。但是,如果这只是大学作业,那么案例 1 和 3 就可以了。

性能方面的案例 1 和 3 似乎消耗更少的函数调用,但我不知道它是否会给你带来显着的改进。

还要记住,大多数流行的 IDE(例如 Eclipse)具有为您自动生成 getter 和 setter 的功能,只需单击几下鼠标按钮即可 - 这应该回答“getter & setter 在 Java 中是如此的麻烦......”

于 2013-04-08T06:27:56.720 回答