Java set和get方法if语句

时间:2014-11-27 00:23:13

标签: java methods get set

我有这个主要课程:

import java.util.Scanner;

public class Rec 
{


    public static void main(String[] args) 
    {
        rectangle myRectangle = new rectangle();
        float w;
        float h;
        Scanner input = new Scanner (System.in);
        System.out.println("Please enter the width of the rectangle");
        w = input.nextFloat();
        myRectangle.setWidth(w);
        //if(myRectangle.width)


        System.out.println("Please enter the height of the rectangle");
        h = input.nextFloat();
        myRectangle.setHeight(h);


        System.out.println("The Perimeter of a rectanle having height of " +myRectangle.height + " and width of " + myRectangle.width + " is " + myRectangle.FindPerimeter());
        //System.out.println(myRectangle.width);
        //System.out.println(myRectangle.FindPerimeter());
        //System.out.println(myRectangle.FindArea());
    }


}

我下面有这个矩形类。如何对其进行编码,以便当用户输入的数字大于20或小于0时​​,程序会要求用户再次输入?这是矩形类:

package rec;


public class rectangle 
{

        float width=1;
        float height=1;
        float perimeter;

        public void setWidth(float w)
        {
           if(w<20 && w>0)
               width = w;
           else
           {
               System.out.println("invalid entry, please try again: ");
               //setWidth(w);
           }    
        }


        public void setHeight(float h)
        {
           if(h<20 && h>0)
               height = h;
           else
           {
               System.out.println("invalid entry, please try again: ");
               //setWidth(h);
           }
        }




        public float getWidth()
        {
           return width;
        }
        public float getHeight()
        {
           return height;
        }
        public float FindPerimeter()
        {
           return (width+height)*2;
        }

        public float FindArea()
        {
           return width*height;
        }

}

提前致谢!

2 个答案:

答案 0 :(得分:2)

不要在你的二传手中做。如果你这样做,你将“模型”和你的“输入”混合在一个类中,所以如果你想改变它(比如从文件中读取),那就更难了。

更改您的主叫代码:

h = -1;
while(h < 0 || h > 20) {
    System.out.println("Please enter the height of the rectangle");
    h = input.nextFloat();
}
myRectangle.setHeight(h);

另一种方法是尝试设置高度并使函数在成功时返回true或在失败时返回false - 这样所有验证都在一个地方

bool done = false;
while(!done) {
    System.out.println("Please enter the height of the rectangle");
    h = input.nextFloat();
    done = myRectangle.setHeight(h);
}

public bool setHeight(float h)
{
   bool ok = false;
   if(h<20 && h>0) {
       height = h;
       ok = true;
   }
   return ok;
}

答案 1 :(得分:1)

setHeight返回boolean来指示高度是否有效是一种可能的解决方案。但是有一些缺点:

(1)如果您在致电setHeight时忘记检查结果,您的程序会认为一切正常,而setHeight实际上失败了。这在Java中太容易了,因为你可以调用一个方法并丢弃结果:

setHeight(40.0);
// keep going as if everything were hunky dory

(2)如果我没有弄错,有些框架期望“setter”方法有无效结果。我认为这是在“bean”的定义中。

我的方法是添加测试有效性的方法:

public class rectangle 
{
    float width=1;
    float height=1;
    float perimeter;

    public boolean isValidWidth(float w) {
       return (w < 20 && w > 0);
    }

    public void setWidth(float w)
    {
       if(isValidWidth(w)) {
           width = w;
       } else {
           throw new IllegalArgumentException("Invalid width");
       }
    }

    // and similarly for height

}

然后调用代码将变为:

boolean done = false;
while(!done) {
    System.out.println("Please enter the width of the rectangle");
    w = input.nextFloat();
    done = myRectangle.isValidWidth(w); 
}
myRectangle.setWidth(w);

do {
    System.out.println("Please enter the width of the rectangle");
    w = input.nextFloat();
} while (!myRectangle.isValidWidth(w));  // keep going as long as width is *not* valid
myRectangle.setWidth(w);

如果程序忘记首先进行有效性检查,则throw存在。如果呼叫者尝试呼叫setWidth(w)并且w无效,则程序将不会继续,就好像一切正​​常一样。相反,程序会因异常而死(或者会在其他地方捕获异常)。

但这两种解决方案都将有效性检查放在rectangle所属的位置;所以我认为两者都比要求来电者知道界限更好。