2013-08-17 135 views
3

书中的问题: 写一个类别模拟充电电池的电池。电池有一个构造公共电池(双倍容量) 容量是以毫安小时为单位测量的值。典型的AA电池容量为2000至3000 mAh。方法 public void drain(double amount) 将电池的容量消耗给定量。方法 public void charge() 将电池充电至其原始容量。方法 public double getRemainingCapacity() 获取电池的剩余容量。实施类Java

我的问题:我的实例变量是否正确?你如何弄清私有实例变量需要什么? (如果这是有道理的)这个代码可以写得更好吗?

我的代码:

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

} 
+0

看起来不错。 – 2013-08-17 04:31:18

回答

0

所有对我来说很好,除了一个事实,即你缺少2000-3000毫安之间的电池容量的验证。因此,请确保在尝试设置容量时,该值处于有效范围内。

夫妇需要做验证的变化:

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

} 
+0

对不起,我是学习java的新手,我只是在学习基础知识,你能告诉我如何在代码中抛出异常吗? –

+0

也可以将'fullCharge'设置为'final'字段,因为它永远不会被修改。 – LaurentG

+0

@RoyKesserwani使用代码更新了答案,如果看不到,请删除任何错误。 –

1

似乎很不错。

如果您不希望任何人以意外的方式从班级外改变它们,则声明变量为private。例如,通过使用访问器方法,可以限制对私有变量的访问(例如get方法但不设置方法)。

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

因此可以说,如果你知道确切你在做什么所有的时间和你使用你的代码只有一个,你就根本不需要私有变量。但没有人是完美的。我们有时会忘记我们多年前写的课程应该做什么,而且一个人的代码经常被许多人使用,而私人变量(以及其他无数特性)在那里提供了结构和标准,每个人都可以遵循和达成一致。

0

是的一切看起来不错。

你如何找出需要在私人实例 变量中需要的内容?

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

2

你的实例变量看起来不错。

一般情况下,大部分实例变量都是私有的,当且仅当私人实例变量没有意义,或者没有提供任何利润时,才会使其变为公共。在该方法中漏极

使用化合物赋值运算符()

batteryCapacity -= amount; 

可以更新方法和构造,以检查(负值)的范围内。

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

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

}