(Java)我可以创建一个对象并在同一行上使用setter吗?

时间:2018-01-11 12:25:35

标签: java eclipse object variables setter

是否可以在JAVA中创建一个对象,然后立即在同一行上使用setter?

喜欢这样:Class classname = new Class() .setSomething(" String");

我怎么能正确地做到这一点,eclipse总是说:

  

类型不匹配:无法从void转换为Class

2 个答案:

答案 0 :(得分:4)

您获得的错误只是因为setSomething()的返回值为void。例如。方法看起来像这样;

public void setSomething(String something){
    this.something = something;
}

由于void无法分配给任何内容,因此您无法在线创建对象并在其上调用方法。但是在将签名更改为以下内容时仍然可以:

class MyClass{
    private String something;

    public MyClass setSomething(String something){
        this.something = something;
        return this; // returning this
    }
}

return this的使用称为method-chaining,主要可以在构建器模式中看到。

虽然以上操作可能有效,但您可能希望在创建something实例时始终将MyClass设置为值。为此,您必须添加一个自定义构造函数,该构造函数接受something的初始值。 E.g:

class MyClass{

    private final String something;

    public MyClass(String something){
        this.something = something;
    }
}

然后可以使用以下内容:

MyClass myclass = new MyClass("Something");

后者优先于先前。因为这样,对象是使用值集创建的,并且不能处于无效状态。 (例如,当没有设置something时,这可能会导致讨厌的NullPointerException s。。

  

注意:您可能已经看到我在声明变量final时使用了关键字something。如果您希望稍后可以将something更改为其他值,则可以省略此项,但是当您按原样保留它时,您创建了一个不可变的MyClass实例,该实例最常被优先考虑可变的实例。

答案 1 :(得分:0)

你可以像@Jens所说的那样使用Builder Pattern做类似的事情。

public class Car {

   private String brand;

   public Car(String brand) {
      this.brand = brand;
   }

   public static class Builder {

      private String brand;

      public static Builder withBrand(String newBrand) {
         Builder builder = new Builder();
         builder.brand = newBrand;        
         return builder;
      }

      public static Car build() {
         return new Car(this.brand);
      }
   }
}

所以你可以这样叫一辆新车:

Car evoque = new Car.Builder().withBrand("Range Rover").build();

如果要设置许多属性并且不需要广泛的构造函数,则构建器模式非常有用。