是否可以在JAVA中创建一个对象,然后立即在同一行上使用setter?
喜欢这样:Class classname = new Class()
.setSomething(" String");
我怎么能正确地做到这一点,eclipse总是说:
类型不匹配:无法从void转换为Class
答案 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();
如果要设置许多属性并且不需要广泛的构造函数,则构建器模式非常有用。