2013-08-17 185 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; 
} 

}