#java
#java
Вопрос:
Я создал класс point в Java:
public class Point {
private final float THRESHOLD = (float) 0.0001;
private final float x;
private final float y;
//getter
public float getX(){return x;}
public float getY(){return y;}
//constructor
public Point(float x,float y){this.x = x;this.y = y;}
//equals
public boolean equals(Object p1) {
if (p1 != null amp;amp; p1.getClass() == getClass()) {return (Float.floatToIntBits(x) == Float.floatToIntBits(((Point) p1).x))
||(Float.floatToIntBits(y) == Float.floatToIntBits(((Point) p1).y)
||Math.abs(x - ((Point) p1).x) < THRESHOLD amp;amp; Math.abs(y - ((Point) p1).y) < THRESHOLD);}
return false;
}
//toString
public String toString() {
return "x=" x " y=" y;
}
}
Затем я создал класс rectangle, используя две точки как TopLeft и bottomright:
public final class Rectangle {
private final Point topLeft;
private final Point bottomRight;
//getters
public Point gettopLeft() {return topLeft;}
public Point getbottomRight() {return bottomRight;}
//constructor
Rectangle(Point topLeft,Point bottomRight){this.topLeft = topLeft; this.bottomRight = bottomRight;}
Rectangle(float topLeftX,float topLeftY,float bottomRightX, float bottomRightY){
this(new Point(topLeftX,topLeftY),new Point(bottomRightX,bottomRightY));
}
//equals
public boolean equals(Object r1) {
if (((Rectangle)r1).bottomRight == this.bottomRight amp;amp;
((Rectangle)r1).topLeft == this.topLeft amp;amp;
r1.getClass() == getClass()) {return true;}
return false;
}
//toString
public String toString() {
return "topLeft: " topLeft " bottomRight" bottomRight;
}
//computeArea
public float computeArea() {
return Math.abs(
(topLeft.getX() - bottomRight.getX())*(bottomRight.getY() - topLeft.getY()));
}
}
Однако мы все знаем, что когда один параметр в точке равен NaN, rectange не должен работать (например, ошибки throw), как его спроектировать? Спасибо.
Комментарии:
1.
Rectangle
Конструктор может проверить это, используяFloat.isNan()
который принимаетfloat
значение в качестве параметра.
Ответ №1:
Вы можете использовать Float.isNan
метод:
Rectangle(Point topLeft, Point bottomRight){
if (Float.isNan(topLeft.getX()) || Float.isNan(topLeft.getY()) ||
Float.isNan(bottomRight.getX()) || Float.isNan(bottomRight.getY())) {
throw new IllegalArgumentException("Point contains non-numeric coordinate");
}
this.topLeft = topLeft;
this.bottomRight = bottomRight;
}
В качестве альтернативы вы можете инкапсулировать эту проверку в Point
класс, добавив метод, который будет возвращать только true
в том случае, если обе координаты не являются NaN. Тогда вы сможете вызвать этот метод для обеих точек в Rectangle
конструкторе.