2016-12-02 6 views
1

私は家の中で家電製品のエネルギー消費量を出力しようとしている課題に取り組んでいます。 ElectricCookerというApplianceElectricShowerというApplianceを作成しました。彼らは両方とも、異なる変数名から離れて全く同じコードを持っています。ここでメソッドが誤った値を出力していますか?

は、関連するコードです(コードの量については申し訳ありません、これは番組を再生する)

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 

私はこれを何時間も作業してきましたが、まったく同じコードが何らかの形で別の結果を生み出すのかどうか分かりません。彼らは全く同じことをして同じプロセスを経ると、どのようにしてと他の5になるか分かりません。どんな助けでも大変感謝しています。

+0

コードの理解を妨げている別の問題は、どこにでも重複があることです。アプライアンスのサブクラスを削除し、異なるパラメータをコンストラクタに渡して、新しいアプライアンスインスタンスを作成します。また、Meterクラスも削除してください。それは不要で、コードを複雑にします。最後に、問題を示すために必要なコードが最小限に抑えられる方法はありません。関係のないすべてのものを編集します(たとえば、関係のないすべてのフィールドやメソッド)。デバッガを使用することを学ぶことも役立ちます。 – Bohemian

答えて

2

ElectricMeterクラスはシングルトンです。つまり、アプリケーションの実行中に1つの(同じ)インスタンスが存在することを意味します。

ElectricMeter.getInstance().incrementConsumed(5); 

その後、再度ElectricCooker.timePasses()からこの呼び出しを行います。

まず、ElectricShower.timePasses()から、次の呼び出しを行います。したがって、2回目に消費量を出力すると、10と報告されています。

家の共通の共有電気メーターを表すためにシングルトンを使用することは、合理的な設計決定のようです。

+0

ああ、あなたのフィードバックに感謝しています。 – Tom

関連する問題