这两种方法有什么区别

What is the difference between these two methods

提问人:user574362 提问时间:10/26/2018 更新时间:10/26/2018 访问量:625

问:

这两种方法计算单体的导数,但我不明白它们之间有什么区别,它们做同样的事情吗?为什么一个有返回值,而另一个对调用对象进行更改? 哪个更好? 通常,我应该如何返回对象?

public Monom Der()
{
    double a = this.get_coef() * this.get_pow();
    int b = this.get_pow() - 1;
    return new Monom(a, b);
}

public void Der()
{
        this.set_coefficient(this._power * this._coefficient);
        this.set_power(this._power - 1);
}
Java 对象 返回 Pass-By-Reference Pass-By-Value

评论

0赞 cjstehno 10/26/2018
一般来说,你要避免在 SO 上提出基于意见的问题。你应该把你的问题重新设计成一个有明确答案的东西。
1赞 Stefan Fischer 10/26/2018
你完全理解。第一个创建一个对象,第二个改变一个对象。如果您可能需要原始值,则第一个更好,而第二个值会丢失。newthis

答:

0赞 Kenny Tai Huynh 10/26/2018 #1

你可以用谷歌搜索一下细节。这里一开始有很多事情。

  1. 区别:一个是返回的对象单调,一个是“void”

  2. 原因:这取决于您的业务或您要构建的代码的目的。返回的对象由下一步使用,或者只显示数据。“void”表示您不想获取任何数据,而是在该方法中执行一些操作

  3. 哪个更好:很难说。如前所述,这应该取决于您的需要

  4. 你应该如何返回:参考这个:https://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html

继续搜索更多/练习更多。那就更容易了。

希望这会有所帮助。

0赞 Sylordis 10/26/2018 #2

第一种方法创建一个新对象,该对象将包含操作结果,但不影响当前对象,第二种方法直接更改您正在使用的对象。

2赞 user10386912 10/26/2018 #3

这个

public Monom Der() {
    double a = this.get_coef() * this.get_pow();
    int b = this.get_pow() - 1;
    return new Monom(a, b);
}

不会更改实例的状态,当您想要拥有不可变对象时,它很有用。它可用于处理初始状态和处理后状态

Monom initialMonom = new Monom(2, 2);
Monom theNewMonom = initialMonom.Der();
// do something with both initialMonom and theNewMonom

这个

public void Der() {
    this.set_coefficient(this._power * this._coefficient);
    this.set_power(this._power - 1);
}

更改当前实例的状态,因此该实例不是不可变的。当需要重用实例时,它可能很有用

Monom initialMonom = new Monom(2, 2);
// do something with initial monom
initialMonom.Der(); // mutate the initial monom
// do something with the new state 

评论

0赞 Peter Lawrey 10/26/2018
请注意,虽然它在全国范围内创建了一个对象,但可以通过逃逸分析来消除诸如此类的短期对象。
0赞 Glains 10/26/2018 #4

虽然您说两种方法的作用相同,但这不一定是真的,因为您的第一个方法计算结果并返回它,您的第二个方法计算结果,但将其分配给当前对象中的状态。

让我们考虑以下类:

public class Dinner {

    private Meal meal;

    public Dinner(Meal meal) {
        this.meal = meal;
    }

    public Meal getMeal(Meal meal) {
        return meal;
    }

    public setMeal(Meal meal) {
        this.meal = meal;
    }
}

这里,修改了对象的内部状态,但它没有返回值。另一方面,返回对象的当前状态,但不修改它。setMealgetMeal

想想你在用例中到底需要什么:如果你想修改一个对象的内部数据,那就选择第二种方式。例如,如果要返回计算结果或内部状态,请将某些内容返回给调用方,以便他可以使用它进行操作。

最后,这只是一些想法,实现一个特定的问题总是有很多不同的可能性,所以这个问题没有完美的答案。