Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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 - Fatal编程技术网

减少java对象添加中的样板文件

减少java对象添加中的样板文件,java,Java,我想为我的简单对象编写add、subtract和equals方法,允许字段中为null。我最终使用python生成样板代码,这告诉我我做错了什么。写这样一个类的方法是什么 package com.blicket.parser; /** * Created by steve on 8/22/16. */ public class Foo { public Integer bar; public Integer baz; public Integer qux;

我想为我的简单对象编写add、subtract和equals方法,允许字段中为null。我最终使用python生成样板代码,这告诉我我做错了什么。写这样一个类的方法是什么

package com.blicket.parser;

/**
 * Created by steve on 8/22/16.
 */
public class Foo {
    public Integer bar;
    public Integer baz;
    public Integer qux;

    public boolean equals(Foo b){
        if(
            (this.bar == b.bar || this.bar.equals(b.bar) &&
            (this.baz == b.baz || this.baz.equals(b.baz) &&
            (this.qux == b.qux || this.qux.equals(b.qux) &&
        ){
         return true;
        } else {
            return false;
        }
    }

    public Foo add(Foo a, Foo b){
        Foo c = new Foo();
        c.bar = a.bar + b.bar;
        c.baz = a.baz + b.baz;
        c.qux = a.qux + b.qux;
        return c;
    }
}
编辑:我使用==进行空检查,但它是多余的。别这样,读者。我留下了错误的代码示例,以确保注释有意义

编辑2:如果bar、baz或qux为null,则尝试去掉==检查不起作用

public boolean equals(Foo b){
    if(
        this.bar.equals(b.bar) &&
        this.baz.equals(b.baz) &&
        this.qux.equals(b.wux)
    ){
     return true;
    } else {
        return false;
    }
}
抛出NullPointerException

编辑3电子禧年:看起来正确的答案是

public boolean equals(Foo b){
    return Objects.equals(this.bar, b.bar) &&
        Objects.equals(this.baz, b.baz) && 
        Objects.equals(this.qux, b.qux);
}

您应该尝试Groovy,它支持带重载的+和-操作:

第十章。运算符重载

因此,您可以编写以下内容,而不是公共布尔addFoo a,Foo b:

def plus(Foo foo){
  this.bar+=foo.bar
  this.baz+=foo.baz
  this.qux*=foo.qux
}
然后将其用作:

  Foo a = ...
  Foo b = ...
  Foo c = a + b;

因此,对您的问题的正确答案是扩展语言,而不是生成样板代码。

除了代码生成、字节码生成或运行时反射之外,对于一般情况,显然没有办法做到这一点。@azurefrog:我在摆弄三个勾号块的格式,但没有得到我想要的结果。我看到你把一切都缩进了;这是获得更好成绩的唯一途径吗?关于为什么triple tick失败的想法?以下是答案。我不熟悉这三个滴答声。也许SO的格式化程序不支持它?@bwarren2不支持复杂的等号,只需返回Objects.equalThis.bar、b.bar&&Objects.equalThis.baz、b.baz&&Objects.equalThis.qux、b.qux;。这将为您处理空情况。在一般情况下,使用不同的语言可能不是可行的解决方案。即使groovy是可行的答案,重写运算符也需要与定义Fooadd相同的代码