2016-12-02 126 views
1

因此,我正在完成一項試圖輸出房屋內電器能耗的作業。我創建了名爲ElectricCookerAppliance和名爲ElectricShowerAppliance。除了不同的變量名稱之外,它們都具有完全相同的代碼,但一些如何產生不同的輸出。方法輸出的值不正確?

下面是相關的代碼:(抱歉的代碼量,這個再現程序)

ElectricCooker

public class ElectricCooker extends Appliance 
{ 

    public int isOn = -1; 
    public int isOff = 0; 
    public int incrementTime; 
    public int varPass = -1; 

    @Override 
    public int currentState() 
    { 

     if (varPass == 0) 
     return isOff; 
     else 
     { 
      return isOn; 
     } 
     //returns isOn; 
} 

    @Override 
     public void useTime(int defaultTime) 
     { 

      defaultTime = 15; 
      incrementTime = 4; 

     } 

     public void cook() 
     { 
      //add code 
     } 

    @Override 
     public void timePasses() 
     { 

      if(varPass == isOff) 
       varPass = 0; 
      else 
      { 

      ElectricMeter.getInstance().incrementConsumed(electricityUse); 
      ElectricMeter.getInstance().incrementConsumed(5);  
      int getCookerConsumed = ElectricMeter.getInstance().getElectricityUsed(); 

      System.out.println("Electric cooker electricity consumption = " + getCookerConsumed); 

      } 

     } 


    ElectricCooker(int electricityUse, int gasUse, int waterUse, int timeOn) 
{ 
    super(electricityUse, gasUse, waterUse, timeOn); 

    this.electricityUse = 5 * incrementTime; 
    this.gasUse = 0 * incrementTime; 
    this.waterUse = 0 * incrementTime; 
    this.timeOn = 15 * incrementTime; 

} 

} 

ElectricShower

public class ElectricShower extends Appliance 
{ 

    public int isOn = -1; 
    public int isOff = 0; 
    public int incrementTime; 
    public int varPass = -1; 

    @Override 
    public int currentState() 
    { 

     if (varPass == 0) 
     return isOff; 
     else 
     { 
      return isOn; 
     } 
     //returns isOn; 
} 

    @Override 
     public void useTime(int defaultTime) 
     { 

      defaultTime = 15; 
      incrementTime = 4; 

     } 

    @Override 
     public void timePasses() 
     { 

      if(varPass == isOff) 
       varPass = 0; 
      else 
      { 

      ElectricMeter.getInstance().incrementConsumed(electricityUse); 
      ElectricMeter.getInstance().incrementConsumed(5);  
      int getShowerConsumed = ElectricMeter.getInstance().getElectricityUsed(); 

      System.out.println("Electric shower electricity consumption = " + getShowerConsumed); 

      } 

     } 


    ElectricShower(int electricityUse, int gasUse, int waterUse, int timeOn) 
{ 
    super(electricityUse, gasUse, waterUse, timeOn); 

    this.electricityUse = 5 * incrementTime; 
    this.gasUse = 0 * incrementTime; 
    this.waterUse = 0 * incrementTime; 
    this.timeOn = 15 * incrementTime; 

} 

} 

電器

abstract public class Appliance 
{ 
    public int varPass; 
    public int isOn; 
    public int isOff; 
    public int electricityUse, gasUse, waterUse, timeOn; 


    public abstract void useTime(int defaultTime); 

    public int currentState() 
    { 

     if (varPass == 0) 
     return isOff; 
     else 
     { 
      return isOn; 
     } 

     //returns isOn; 
} 
    public abstract void timePasses(); 

Appliance(int electricityUse,int gasUse,int waterUse,int timeOn) 
{ 
    electricityUse = 0; 
    gasUse = 0; 
    waterUse = 0; 
    timeOn = 0; 
} 

} 

ElectricMeter

public class ElectricMeter 
{ 
    ElectricMeter() {} 
private static ElectricMeter instance = new ElectricMeter(); 
public static ElectricMeter getInstance() { return instance; } 

private int electricityUsed = 0; 
public void incrementConsumed(int value) 
{ 
    electricityUsed += value;  
} 

     public int getElectricityUsed() 
     { 
     return electricityUsed; 
     } 
} 

import java.util.ArrayList; 

    public class House 
    { 

     ArrayList<Appliance> applianceList = new ArrayList<>(); 


     ElectricShower calleShower = new ElectricShower(1, 1, 1, 1); 
     ElectricCooker calleCooker = new ElectricCooker(1, 1, 1, 1); 


     public void addAppliance() 
     { 

      applianceList.add(calleShower); 
      applianceList.add(calleCooker); 


     } 

     public void timePasses() 
     { 

      calleShower.timePasses(); 
      calleCooker.timePasses(); 

      //this method is called as part of the simulation to trigger a new fifteen minute period 
      //in the house. When it is called, it will in turn call timePasses() on all the Appliances in the House. 

     } 
    } 

public class CourseworkTest { 



    public static void main(String[] args) 
    { 

    House callHouse = new House(); 
    callHouse.timePasses(); 

    } 

} 

輸出

Electric shower electricity consumption = 5 
Electric cooker electricity consumption = 10 

我一直在這個小時工作,我只是不明白如何完全相同的代碼可以產生不同的結果?我看不出10和其他5當他們做完全相同的事情,並通過相同的過程。非常感謝任何幫助,謝謝。

+0

您擁有的另一個問題是妨礙您理解您的代碼,因爲您到處都有重複。刪除設備的子類,並將不同的參數傳遞給其構造函數以創建新的設備實例。同時刪除Meter類。這是沒有必要的,也使你的代碼複雜化。最後,這是展示問題所需的最少代碼。編輯出所有不相關的東西(例如,所有不相關的字段和方法)。學習使用調試器也會有所幫助。 – Bohemian

回答

2

ElectricMeter類是一個單例,意味着在應用程序的執行過程中會存在一個(相同的)實例。

首先,從ElectricShower.timePasses(),你做以下電話:

ElectricMeter.getInstance().incrementConsumed(5); 

然後,你再從ElectricCooker.timePasses()撥打這個電話。因此,當您第二次輸出消耗量時,報告爲10

使用一個單身代表一個房子共同的共享電錶看起來像一個合理的設計決定。

+0

啊,我看到了,感謝您的反饋意見,現在有道理。 – Tom