Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
惯用Java:约束数据_Java_Coding Style - Fatal编程技术网

惯用Java:约束数据

惯用Java:约束数据,java,coding-style,Java,Coding Style,使用一个简单的JavaPoint类,我想将X和Y值限制为双倍,必须在-10到10之间,包括10到10。我已经编写了一些代码,但我已经多年没有编写java了,我想知道这是否是用现代java编写的: public class Point { private double x; private double y; public Point(double x, double y) { constrain("x", x); constrain("y

使用一个简单的Java
Point
类,我想将X和Y值限制为双倍,必须在-10到10之间,包括10到10。我已经编写了一些代码,但我已经多年没有编写java了,我想知道这是否是用现代java编写的:

public class Point {
    private double x;
    private double y;

    public Point(double x, double y) {
        constrain("x", x);
        constrain("y", y);
        this.x = x;
        this.y = y;
    }

    // is there a cleaner/shorter way of handling this, such as a direct way of declaring a
    // subtype of double that I could use in method signatures?
    protected static void constrain(String name, double val) {
        if ( val < -10 || val > 10 ) {
            throw new IllegalArgumentException(name + " must be between -10 and 10");
        }
    }

    public double getX() { return x; }

    public void setX(double x) {
        constrain("x", x);
        this.x = x;
    }

    public double getY() { return y; }

    public void setY(double y) {
        constrain("y", y);
        this.y = y;
    }

    @Override
    public String toString() {
        return ("[" + x + "," + y + "]"); 
    }
}
公共类点{
私人双x;
私人双y;
公共点(双x,双y){
约束(“x”,x);
约束(“y”,y);
这个.x=x;
这个。y=y;
}
//是否有更干净/更短的处理方法,例如直接声明
//我可以在方法签名中使用的double的子类型?
受保护的静态void约束(字符串名称,双val){
如果(val<-10 | val>10){
抛出新的IllegalArgumentException(name+“必须介于-10和10之间”);
}
}
公共双getX(){return x;}
公共无效集x(双x){
约束(“x”,x);
这个.x=x;
}
公共双getY(){return y;}
公共空间设置(双y){
约束(“y”,y);
这个。y=y;
}
@凌驾
公共字符串toString(){
返回(“[”+x+“,“+y+”]);
}
}

我可能会这样做:

public class Point
{

    private static final double X_MIN = -10.0, X_MAX = 10.0;
    private static final double Y_MIN = -10.0, Y_MAX = 10.0;

    private double x, y;

    public Point(double x, double y) throws IllegalArgumentException
    {
        setX(x);
        setY(y);
    }

    public double getX()
    {
        return x;
    }

    public double getY()
    {
        return y;
    }

    public void setX(double x) throws IllegalArgumentException
    {
        if (x < X_MIN || x > X_MAX)
        {
            throw new IllegalArgumentException("X out of range.");
        }

        this.x = x;
    }

    public void setY(double y) throws IllegalArgumentException
    {
        if (y < Y_MIN || y > Y_MIN)
        {
            throw new IllegalArgumentException("Y out of range");
        }

        this.y = y;
    }

    @Override
    public String toString()
    {
        return String.format("[%.1f,%.1f]", x, y);
    }
}
公共类点
{
私人静态最终双X_最小值=-10.0,X_最大值=10.0;
私人静态最终双Y_最小值=-10.0,Y_最大值=10.0;
私人双x,y;
公共点(双x,双y)抛出IllegalArgumentException
{
setX(x);
赛蒂(y);
}
公共双getX()
{
返回x;
}
公共双盖
{
返回y;
}
公共void setX(双x)抛出IllegalArgumentException
{
如果(xx|u最大值)
{
抛出新的IllegalArgumentException(“X超出范围”);
}
这个.x=x;
}
public void setY(双y)抛出IllegalArgumentException
{
如果(yy|u MIN)
{
抛出新的IllegalArgumentException(“Y超出范围”);
}
这个。y=y;
}
@凌驾
公共字符串toString()
{
返回字符串.format(“[%.1f,%.1f]”,x,y);
}
}

如果X和Y值始终来自同一个域,则可以将它们封装在一个类中,以便为您执行检查:

class Coord {
    private final double scalarValue;
    public Coord(double scalarValue) throws IllegalArgumentException {
        if (Math.abs(scalarValue) > MAX_COORD) {
            throw new IllegalArgumentException("Coordinate out of range");
        }
        this.scalarValue = scalarValue;
    }
    public double getScalar() {
        return scalarValue;
    }
}
这将检查放在一个地方,并允许您在将来扩展坐标功能,而不会弄乱Point类。它还显式地使坐标不可变,这可能是一个好主意(取决于用例)

然后,点构造函数变成:

public Point(Coord x, Coord y);

可能是一个。但是FWIW,这可能是当今最惯用的使用番石榴先决条件来解决的。这可能是基于观点的,可能对codereview.stackexchange.comNo有好处,还没有子类型。不要在通话中重复相反的内容。在构造函数中:this.x=x;替换为setX(x);Naso先生:一个有趣的问题是如何用变量检查实例化Point,我指的不仅仅是限制。1.8具有“轻量级”代码对象,即lambdas,如果需要,可以使用它。(嗨,老Perl黑客!)您的代码是否编译并生成了预期结果?如果是这样的话,问题是什么?你在构造函数中丢失了支票。@劳恩,谢谢你指出这一点;忽略了这一点。答案已编辑。