方法输出的值不正确?

时间:2016-12-02 02:53:57

标签: java methods code-duplication

因此,我正致力于一项试图输出房屋内电器能耗的任务。我创建了一个名为Appliance的{​​{1}}和一个名为ElectricCooker的{​​{1}}。除了不同的变量名称,它们都具有完全相同的代码,但有些代码产生不同的输出。

以下是相关代码:(对不起代码量,这会重现程序)

ElectricCooker

Appliance

ElectricShower

ElectricShower

电器

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;

} 

}

ElectricMeter

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

}

输出

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 。非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

ElectricMeter类是一个单例,意味着在整个应用程序执行过程中将存在一个(相同的)实例。

首先,从ElectricShower.timePasses()开始进行以下调用:

ElectricMeter.getInstance().incrementConsumed(5);

然后,您再次从ElectricCooker.timePasses()拨打此电话。因此,当您第二次输出消耗量时,会将其报告为10

使用单例代表房屋的共用电表似乎是一个合理的设计决策。

相关问题