【问题标题】:Implementing Classes Java实现类 Java
【发布时间】:2013-08-17 04:26:42
【问题描述】:

书中的问题: 编写一个模拟可充电电池的类 Battery。一个电池有一个构造函数 public Battery(double capacity) 其中容量是以毫安时为单位的值。典型的 AA 电池容量为 2000 至 3000 mAh。方法 公共无效排水(双倍量) 将电池的容量消耗给定量。方法 公共无效费用() 将电池充电至其原始容量。方法 公共双 getRemainingCapacity() 获取电池的剩余容量。

我的问题:我的实例变量对吗?您如何确定私有实例变量中需要包含什么? (如果有道理的话)这段代码可以写得更好吗?

我的代码:

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

}  

【问题讨论】:

    标签: java instance-variables


    【解决方案1】:

    您的实例变量看起来不错。

    通常,大多数实例变量都是私有的,当且仅当将实例变量设为私有似乎没有意义或不提供任何利润时,您才将其设为公开。

    在方法drain()中使用复合赋值运算符

    batteryCapacity -= amount;
    

    您可以更新方法和构造函数来检查范围(负值)。

    【讨论】:

      【解决方案2】:

      您的代码添加了小错误检​​查。

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

      【讨论】:

        【解决方案3】:

        对我来说似乎很不错。

        当您不希望任何人以意想不到的方式从类外部更改它们时,您将变量声明为私有。例如,通过使用访问器方法,您可以限制对私有变量的访问(例如 get 方法但没有 set 方法)。

        此外,对于想要使用您的代码但仍不熟悉它的人,您可以为他们提供额外级别的间接/保护,以防止他们通过强制他们使用公共方法访问私有变量而粗心大意地搞砸事情.

        所以有人可以说,如果您确切地知道自己在做什么一直并且您是唯一使用您的代码的人,那么您就不需要私有变量一点也不。但没有人是完美的。我们有时会忘记我们多年前编写的类应该做什么,并且一个代码经常被许多人使用,并且私有变量(以及无数其他功能)在那里提供了每个人都可以遵循和同意的结构和标准。

        【讨论】:

          【解决方案4】:

          在我看来一切都很好,只是您缺少对 2000-3000 mAh 之间的电池容量的验证。因此,请确保当您尝试设置容量时,该值在有效范围内。

          您需要进行一些更改以进行验证:

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

          【讨论】:

          • 对不起,我刚开始学习 java,我只是在学习基础知识,你能告诉我如何在我的代码中抛出异常吗?
          • 也可以将fullCharge 设置为final 字段,因为它不应该被修改。
          • @RoyKesserwani 用代码更新了答案,如果看到请删除任何错误。
          【解决方案5】:

          是的,一切看起来都不错。

          您如何确定私有实例中需要包含哪些内容 变量?

          私有实例变量用于强制这些类的用户使用方法来访问它们。您可以使用 Properties 来获取和设置值。

          【讨论】:

            【解决方案6】:
            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;
            }
            
            }
            

            【讨论】:

              猜你喜欢
              • 2012-03-09
              • 2018-05-01
              • 1970-01-01
              • 2018-10-31
              • 1970-01-01
              • 1970-01-01
              • 2012-10-18
              • 2013-11-03
              相关资源
              最近更新 更多