java - 方法输出的值不正确?

标签 java methods code-duplication

所以我正在做一项任务,试图输出房屋内电器的能耗。我创建了一个ApplianceElectricCooker和一个ApplianceElectricShower 。除了不同的变量名称之外,它们都具有完全相同的代码,但如何产生不同的输出。

以下是相关代码:(抱歉代码量较多,这重现了程序)

电饭锅

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;

} 

}

电淋浴器

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

我已经为此工作了几个小时,但我只是不明白完全相同的代码如何以某种方式产生不同的结果?我不明白怎么会是10及其他5当他们做完全相同的事情并经历相同的过程时。非常感谢任何帮助,谢谢。

最佳答案

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

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

ElectricMeter.getInstance().incrementConsumed(5);

然后,您再次从 ElectricCooker.timePasses() 进行此调用。因此,当您第二次输出消耗时,它将报告为 10

使用单例来表示房屋的公共(public)共享电表似乎是一个合理的设计决策。

关于java - 方法输出的值不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40923964/

相关文章:

javascript - 调用 javascript 构造函数方法

javascript - 如何删除 javascript 监听器中的重复函数?

.net - 为什么我在 Reflector 的 Linq 中看到如此多的代码重复?

javascript - 在 ExtJS6 中创建电子邮件字段组件

java - 如何对齐对象以匹配路径

java - 如何在小数点后添加n个零?

Java:如何在单个定义中组合具有多个签名的方法?

java - 根据字段对自定义类的实例数组进行排序

java - 使用 Java 分析系统内存/CPU 统计信息

java - 在 JAVA 中,将两个整数传递给接受一个整数的方法到底是如何工作的? ( 安卓 )