课堂上有吸气剂和二传手?

时间:2014-10-26 20:37:45

标签: java class setter getter getter-setter

好的,所以我已经把这个课程弄得一团糟,但我似乎无法让加仑人去上班。我想要的是它划分距离以mpg为单位,以便获得你曾经使用的加仑汽油,但是它只会返回0.0。我很确定我的吸气剂和制定者都搞砸了,而且不确定如何解决它。为什么它只返回0.0?

public class BikeCommute 
{

private String route;
private double distanceTraveled;
private int timeRequired;
private String dateTraveled;
private String mode;
private double gallonsSaved;
final private double mpg = 20.8;


public BikeCommute(String mode, String dateTraveled, String route, 
        double distanceTraveled, int timeRequired)
{
    this.mode = mode;
    this.route = route;
    this.distanceTraveled = distanceTraveled;
    this.timeRequired = timeRequired;
    this.dateTraveled = dateTraveled;
}

public double gallonsCalculated(double distanceTraveled, double mpg)
{
    gallonsSaved = distanceTraveled/mpg;
    return gallonsSaved;

}

public double getGallonsSaved()
{
    return this.gallonsSaved;
}

public void setGallonsSaved(double gallonsSaved)
{
    this.gallonsSaved = gallonsSaved;
}

public double getMpg() {
    return mpg;
}

public String toString()
{

    return mode + " " + route + ", " + distanceTraveled + " miles, " + timeRequired + " hrs, " + 
           dateTraveled + ". Gallons saved from switching from car: " + gallonsSaved;
}


}

2 个答案:

答案 0 :(得分:1)

是的,你在这里有一个概念性的问题。

您希望gallonsSaved是从其他值计算的值。通常,这些值不是通过getter和setter访问,而是通过计算(类行为)来访问。

通常有两件事你可以做。第一种是为你的行为所依赖的所有值设置getter和setter - 在这种情况下,distanceTraveled。你可能也有其他领域的getter和setter,但它们与我们目前讨论的行为无关。

然后,编写一个方法,根据对象中当前存在的值运行所需的行为(无论它们是由构造函数还是由setter输入)。

public double gallonsCalculated()
{
    return distanceTraveled/mpg;

}

您将没有gallonsSaved字段,因为它取决于其他字段,因此是多余的。如果需要,可以调用该功能。

第二种方法,特别是在多次调用计算且结果不太可能发生变化时使用,是进行一次计算,将其存储在私有字段中,并在需要值时返回该字段。 / p>

在这种情况下,您应该在使用setter时执行实际计算:

public void setDistanceTravelled( double distanceTravelled ) {
    this.distanceTravelled = distanceTravelled;
    this.gallonsSaved = distanceTravelled/mpg;
}

public double gallonsCalculated() {
    return this.gallonsSaved;
}

这样做是为了使gallonsSaved的内部值始终与当前distanceTravelled匹配。

如果没有distanceTravelled的setter并且它只是从构造函数设置,你可以在构造函数本身进行计算,然后它就永远不会改变。如果你这样做,你甚至可以宣布gallonsSaved final。

你持续获得0的原因是你似乎选择了第二个选项 - 为计算结果保留一个隐藏变量 - 但你从未执行过计算并将其存储在其中。

答案 1 :(得分:0)

gallonsCalculated应该使用this.distanceTraveled,而不是将distanceTraveled作为参数。除非您尝试在那里设置this.distanceTraveled,否则您将忘记分配给它。