实现类Java

时间:2013-08-17 04:26:43

标签: java instance-variables

书中的问题: 写一类可充电电池的电池。一个电池有一个建设公共电池(双容量) 其中容量是以毫安小时为单位的值。典型的AA电池容量为2000至3000 mAh。方法 公共无效排水(双倍数额) 以给定的量排出电池的容量。方法 公共空缺费用() 将电池充电至其原始容量。方法 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;
}

}  

6 个答案:

答案 0 :(得分:2)

你的实例变量似乎很不错。

通常,大多数实例变量都是私有的,当且仅当看起来私有实例变量没有任何意义或者没有提供任何利润时,你才能将其变为公共变量。

在方法drain()

中使用复合赋值运算符
batteryCapacity -= amount;

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

答案 1 :(得分:1)

对我来说似乎很好。

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

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

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

答案 2 :(得分: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;
}

} 

答案 3 :(得分:0)

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

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

  1. 更新构造函数以进行容量验证并抛出一个 如果值超出范围
  2. ,则出现异常
  3. 更新您的排水方法以确保它不会产生容量 否定。
  4. 我在这里直接编写代码,请原谅我是否有任何错误,根据您的需要进行更改或删除任何编译问题:

    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;
    }
    
    }  
    

答案 4 :(得分:0)

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

  

您如何弄清楚私有实例中需要什么?   变量

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

答案 5 :(得分: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;
}

}