0

我正在做一个家庭作业,我确定一个圆柱体的体积。本课的对象是类和对象。我有两个课程,“CylinderTest”和“Cylinder”。气缸测试调用气缸。到目前为止,除了 get 和 set 方法外,一切似乎都在工作。我试图阻止对负数的计算,但这不起作用,它无论如何都会执行计算。

这是 CylinderTest 类

public class CylinderTest
{

    public static void main(String[] args)
    {
        Cylinder myTest = new Cylinder(-1, -1);
        myTest.getHeight();
        myTest.getRadius();
        System.out.println(myTest);

        printHeader();
        double volume = myTest.volume();
        displayCylinder(volume);
    }

    private static void printHeader()
    {
        System.out.println("Cylinder");
        System.out.println("________");
    }

    private static void displayCylinder(double volume)
    {
        System.out.print("Cylinder volume = ");
        System.out.println(volume);
    }
}

这是气缸类

public class Cylinder
{
    // variables
    public static final double PI = 3.14159;
    private double radius, height, volume;

    // constructor
    public Cylinder(double radius, double height)
    {
        this.radius = radius;
        this.height = height;
    }

    // Volume method to compute the volume of the cylinder
    public double volume()
    {
        return PI * radius * radius * height;
    }

    // accessors and mutators (getters and setters)
    public double getRadius()
    {
        return radius;
    }

    public void setRadius(double radius)
    {
        if (radius > 0.0)
            this.radius = radius;
        else
            this.radius = 1.0;
    }

    public double getHeight()
    {
        return height;
    }

    public void setHeight(double height)
    {
        if (height > 0.0)
            this.height = height;
        else
            this.height = 1.0;
    }

    public double getVolume()
    {
        return volume;
    }

    public void setVolume(double volume)
    {
        this.volume = volume;
    }

}
4

5 回答 5

3

在您的构造函数中,您需要使用与 getter 和 setter 相同的测试,而不是直接设置值。目前,您使用new Cylinder(-1,-1).

于 2013-09-27T16:37:02.390 回答
0

您的构造函数应该调用您的设置器,并且您应该检查设置器中的逻辑。如果调用代码传递一个负值,你真的要继续使用 1 的值吗?

于 2013-09-27T16:37:58.307 回答
0

你可以摆脱你的构造函数并使用:

   Cylinder myTest = new Cylinder();
   myTest.setHeight(-1);
   myTest.setRadius(-1);

或者,您可以创建一个“工厂”方法:

   public static Cylinder createCylinder(double radius, double height)
    {
        Cylinder tmp = new Cylinder();
        tmp.setRadius(radius);
        tmp.setHeight(height);
    }

虽然不推荐,但在语法上,您也可以更改构造函数以调用 setters。它看起来像这样:

public Cylinder(double radius, double height)
{
  setRadius(radius);
  setHeight(height);
}

对于这被认为是不好的做法的原因,请参阅: Java call base method from base constructor

于 2013-09-27T16:42:44.477 回答
0

除了不在构造函数中执行测试之外,您还没有设置音量(它在任何时候都是空的)。

因此,将您的构造函数更改为:

public Cylinder(double radius, double height)
{
    this.setRadius(radius);
    this.setHeight(height);
    this.volume = volume();
}

删除 setVolume()和制作setHeight()私有setRadius()

于 2013-09-27T17:02:49.513 回答
0

您的 setter 方法没有进行验证,因为您根本没有调用它们。radius正如其他人评论的那样,一个好主意是在您的构造函数中调用它们,而不是直接为and赋值height

像您一样初始化圆柱体的属性本身并没有错。但是,由于您需要对输入运行“<=0”验证,并且您的设置器已经实现了这个,因此调用它们是一个简单的解决方案。

一些额外的注释不会影响您正在寻找的结果,但仍然跳出来给我:

  • TestCylinder中,您调用了两个 getter 方法,但没有将它们分配给任何东西。请记住,getter 返回一个值,因此自己调用它们实际上什么都不做。
  • 同样在 中TestCylinder,您Cylinder.volume()直接调用,而不是使用它的 getter 方法getVolume来获取圆柱体的体积。在这里,我建议将计算音量的逻辑放在 getter 上并仅使用该方法,或者使用 getter call volume(),以防您在课程的另一部分需要后者Cylinder
于 2013-09-27T17:53:40.033 回答