3

书中问题:编写一个模拟可充电电池的类 Battery。电池有一个构造函数 public Battery(double capacity) ,其中容量是以毫安时为单位的值。典型的 AA 电池容量为 2000 至 3000 mAh。public void drain(double amount) 方法将电池的容量消耗给定量。public void charge() 方法将电池充电至其原始容量。public double getRemainingCapacity() 方法获取电池的剩余容量。

我的问题:我的实例变量对吗?您如何确定私有实例变量中需要包含什么?(如果这是有道理的)这段代码可以用更好的方式编写吗?

我的代码:

public class Battery
{

      private double fullCharge;
      private double batteryCapacity;

public Battery(double capacity)
{

      batteryCapacity = capacity;
      fullCharge = capacity;

}
public void drain(double amount)
{
     batteryCapacity = batteryCapacity - amount;
}

public void charge()
{

     batteryCapacity = fullCharge;
}

public double getRemainingCapacity()
{
     return batteryCapacity;
}

}  
4

6 回答 6

2

您的实例变量似乎相当不错。

通常,大多数实例变量都是私有的,并且当且仅当将实例变量设为私有似乎没有意义或不提供任何利润时,您才将其设为公开。

在方法 drain() 中使用复合赋值运算符

batteryCapacity -= amount;

您可以更新方法和构造函数以检查范围(负值)。

于 2013-08-17T04:41:47.183 回答
1

对我来说似乎还不错。

当您不希望任何人以意想不到的方式从类外部更改它们时,您将变量声明为私有。例如,通过使用访问器方法,您可以限制对私有变量的访问(例如 get 方法但没有 set 方法)。

此外,对于想要使用您的代码但仍然不熟悉它的人,您可以为他们提供额外的间接/保护级别,以防止他们通过强制他们使用公共方法访问私有变量而粗心大意地搞砸事情。

所以有人可以说,如果你一直都知道自己在做什么并且你是唯一一个使用你的代码的人,那么你根本不需要私有变量。但没有人是完美的。我们有时会忘记我们多年前编写的类应该做什么,并且一个代码经常被许多人使用,并且私有变量(以及无数其他功能)在那里提供了每个人都可以遵循和同意的结构和标准。

于 2013-08-17T04:30:39.050 回答
1

您的代码添加了少量错误检查。

public class Battery
{
      private final int MAX_BATTERY_LIMIT = 3000;
      private double fullCharge;
      private double batteryCapacity;


public Battery(double capacity)
{
     if(capacity <=  MAX_BATTERY_LIMIT)
     { 
         batteryCapacity = capacity;
         fullCharge = capacity;
     }
     else
     {
          throw new IllegalArgumentException("battery capacity out of range: " + this.batteryCapacity +  " expected range 0 <= batteryCapacity < " +            MAX_BATTERY_LIMIT);

     }

}
public void drain(double amount)
{
     batteryCapacity = batteryCapacity - amount;
     if(batteryCapacity < 0) 
      batteryCapacity = 0;
}

public void charge()
{

     batteryCapacity = fullCharge;
}

public double getRemainingCapacity()
{
     return batteryCapacity;
}

} 
于 2013-08-17T04:53:38.617 回答
0

除了您缺少 2000-3000 mAh 之间的电池容量验证之外,一切对我来说都很好。因此,请确保当您尝试设置容量时,该值在有效范围内。

您需要进行一些更改才能进行验证:

  1. 更新构造函数以验证容量并在值超出范围时抛出异常
  2. 更新您的排水方法以确保它不会使容量为负数。

我直接在这里编写代码,所以请原谅我的任何错误,根据您的需要进行更改或删除任何编译问题:

public class Battery
{

      private final double fullCharge;
      private double batteryCapacity;

public Battery(double capacity)
{

      if(capacity < 2000 || capacity > 3000)
          throw new Exception("Cannot create Battery as the capacity should be in betweeen 2000 and 3000");
      batteryCapacity = capacity;
      fullCharge = capacity;

}
public void drain(double amount) throws Exception
{
     if((batteryCapacity - amount) < 0 || (batteryCapacity - amount) > 3000) 
         throw new Exception("The amount is invalid as the battery capacity is going out of range");
     else 
              batteryCapacity = batteryCapacity - amount;
}

public void charge()
{

     batteryCapacity = fullCharge;
}

public double getRemainingCapacity()
{
     return batteryCapacity;
}

}  
于 2013-08-17T04:29:56.160 回答
0

是的,一切看起来都不错。

您如何确定私有实例变量中需要包含什么?

私有实例变量用于强制这些类的用户使用方法来访问它们。您可以使用属性来获取和设置值。

于 2013-08-17T04:32:09.507 回答
0
Are my instance variables right?

看起来不错。

How do you figure out what needs to be in the private instance variables? 

当您不希望用户直接操作变量时,您可以将变量设为私有。操作应仅由您提供的公共功能(如 getter/setter)。

Can this code be written in a better way?

我认为的一种方法是检查边缘情况。

public class Battery {

private double fullCharge;
private double batteryCapacity;
private static double maxCapacity = 100;  //some value

public Battery(double capacity) {
    if (capacity > maxCapacity) {
        throw new RuntimeException("Exceeding max battery charge capacity");
    }
    batteryCapacity = capacity;
    fullCharge = capacity;
}

public void drain(double amount) {
    double tempBatteryCapacity = batteryCapacity - amount;
    if (tempBatteryCapacity < 0) {
        batteryCapacity = 0;
    } else {
        batteryCapacity = tempBatteryCapacity;
    }
}

public void charge() {

    batteryCapacity = fullCharge;
}

public double getRemainingCapacity() {
    return batteryCapacity;
}

}
于 2013-08-17T04:44:18.240 回答