2014-10-26 213 views
0

好吧,所以我主要想到这个课程,但我似乎无法让加仑保存起作用。我想要的是,为了得到如果你使用汽车时使用过的加仑汽油,它将划分的距离除以mpg,但它只返回0.0。我很确定我的getter和setter搞砸了,而不确定如何解决它。为什么它只是返回一个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; 
} 


} 
+0

Getters/setters对我来说很好。 – Drux 2014-10-26 20:48:14

+0

您的gallonsCalculated方法不应该设置对象的加仑保存,或者使用对象自己的distanceTraveled和mpg。这应该不会导致它返回0.0。 – Martin 2014-10-26 20:50:46

回答

1

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

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

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

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

public double gallonsCalculated() 
{ 
    return distanceTraveled/mpg; 

} 

您将没有gallonsSaved字段,因为它取决于其他字段,因此是多余的。当你需要它时,你可以调用这个函数。

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

在这种情况下,你只要使用你的制定者应执行实际的计算:

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

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

是这样的做,这样的gallonsSaved内在价值总是当前distanceTravelled匹配。

如果distanceTravelled没有设置方法,并且只能从构造函数中设置,那么可以在构造函数中进行计算,它将永远不会改变。如果你这样做,你甚至可以宣布gallonsSaved final。

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

+0

非常感谢!这是有道理的。 – 2014-10-26 21:23:07

0

gallonsCalculated也许应该使用this.distanceTraveled,而不是采取distanceTraveled作为参数。除非你想在那里设置this.distanceTraveled,在这种情况下,你忘记了分配给它。