【问题标题】:Class method and constructor confusion in javajava中的类方法和构造函数混淆
【发布时间】:2014-01-13 01:44:14
【问题描述】:

我有一个类,它负责创建一个带有两个输入参数的简单方法。该方法需要在其他类中创建其他方法时使用。我的问题是,我写它的方式是否正确?当在另一个类中调用这个方法时,它会是什么样子?

public class IntlDensity {

    static double p = PhysicalConst.pi; 

    public IntlDensity(double m, double r) {
    }

    public double irho (double mass, double rad) {
       return(mass/(((4.0/3)*p*Math.pow(rad, 3))));
    }
}

【问题讨论】:

  • 我看不出你已经拥有的有什么问题。 Java 中的 design patterns 怎么样?
  • 我不记得为什么我先创建一个构造函数,然后在它下面创建一个方法。这样我可以使用构造函数从另一个类调用方法吗?
  • 如果pi 假定为常量,则将其命名为PI(这是惯例)。此外,如果它是恒定的,那么为什么要为它创建单独的静态字段?您不能在计算中只使用PhysicalConst.PI 吗?如果您想使用它的较短版本,请使用 static import 并仅使用 PI
  • 是的,我相信我可以。不过,我不相信它在计算中看起来像我想要的那样干净。我将有机会 PI 遵守约定。还将使用导入实用程序,谢谢。我主要是在方法本身遇到问题。

标签: java class methods constructor


【解决方案1】:

你可能想做的是:

public class PhysicalBody {

    private double mass;
    private double rad;

    public PhysicalBody(double m, double r) {
        this.mass = m;
        this.rad = r;
    }

    public double getIrho() {
       return(mass/(((4.0/3)*PhysicalConst.pi*Math.pow(rad, 3))));
    }

    public double getMass() { return mass; }
    public double getRad() { return rad; }
}

这将创建一个新对象,存储您在构造函数中指定的massrad,然后您可以根据需要查询该对象的 irho。请注意,我已命名该类以更好地描述它包含的内容。考虑对象,而不是活动。

您现在可以根据需要添加更多方法。

一般来说,从另一个类中提取静态值并按照您的方式复制它们是一个坏主意 - 只需像我在这里一样引用它或进行静态导入,这样您就不需要 PhysicalConst. 所有时间,但实际上仍然引用相同的值。

您还可以考虑使质量和弧度保持不变,具体取决于您是否预计它们会不断变化。

【讨论】:

    【解决方案2】:

    我建议让你的方法 static 像这样 -

    public class IntlDensity {
      private static final double PI = PhysicalConst.pi;     // A local PI constant?
    
      public static double irho(double mass, double rad) {   // Static
        return (mass / (((4.0 / 3) * PI * Math
            .pow(rad, 3))));
      }
    }
    

    【讨论】:

      【解决方案3】:

      您是否有理由要实例化 IntlDensity 对象?如果没有,您可以将方法设为静态并调用它

      ...
      IntlDensity.irho(5,2);
      
      public class IntlDensity {
      
          static double p = PhysicalConst.pi; 
      
          public static double irho (double mass, double rad) {
             return(mass/(((4.0/3)*p*Math.pow(rad, 3))));
          }
      }
      

      【讨论】:

        【解决方案4】:

        首先,无论您是新手还是经验丰富的老手,您总会回顾代码并意识到它本可以更好。

        在这种情况下,没有神奇的方法可以知道您是否可以“更好地”编写您的课程,但您暗示了最好的方法——您的课程客户的观点。换句话说,想象一下使用IntlDensity 的代码会是什么样子。

        一种方法是使用Test-Driven Development。这需要一些时间来适应,但单元测试通常是改进类 API 的好方法,因此它对调用者有意义。

        关于这个类,我可以说的一点是你应该使用你的构造函数:

        public class IntlDensity {
            private double mass;
            private double rad;
        
            public IntlDensity(double mass, double rad) {
              this.mass = mass;
              this.rad = rad;
            }
        
            public double irho() {
               return mass/(((4.0/3) * PhysicalConst.PI * Math.pow(rad, 3)));
            }
        }
        

        然后你的客户会这样做:

        IntlDensity id = new IntlDensity(5, 10);
        System.out.println(id.irho());
        

        当然,这取决于您要做什么。这就是为什么要考虑来电者的问题。

        【讨论】:

          【解决方案5】:
          1. 您的构造函数没有用,因为您没有对传入的参数做任何事情。
          2. 不要创建引用现有其他静态字段的新静态字段
          3. Pi 在 Math 中被定义为常量,所以也不要在其他包中定义它
          4. Irho 应该是静态的,因为它不使用类的任何成员。

          根据您的实际代码,您可能希望将质量等传递给构造函数,而不向 irho 传递任何内容,尽管数学类通常只使用静态字段和方法就可以了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-01-12
            • 1970-01-01
            • 2017-03-18
            • 2018-04-01
            • 2014-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多