在方法参数中使用setter传递新对象

时间:2019-06-12 09:01:25

标签: java

我试图将新的Object作为方法参数传递,并同时设置其变量。

这是一个不错的解决方案,但是又大又不好...

EventBox evtbox = new EventBox();
evtbox.setFloorColor(floorColor);
scriptUtils.runScript("sc-cfrmd",evtbox);

我需要这样的东西来缩短它

scriptUtils.runScript("sc-cfrmd",new EventBox().setFloorColor(floorColor)); 

当然,做到这一点的逻辑方法是在EventBox类中创建一个构造函数,但我需要找出不使用构造函数的方法。

感谢任何提示

3 个答案:

答案 0 :(得分:1)

您可以通过添加所需的方法来使用方法链接。按照惯例,将设置者/获取者作为标准做法,只照其名字所说即可。

public EventBox withFloorColor(String floorColor) {  
 setFloorColor(floorColor);   
 return this; 
}


scriptUtils.runScript("sc-cfrmd",new EventBox().withFloorColor(floorColor));

答案 1 :(得分:1)

您正在寻找fluent interface 通常,当您需要创建复杂的对象时,可以使用builder design pattern实现流畅的界面 例如:

import java.awt.Color;

public class EventBox {

    private Color floorColor;

    private EventBox() {
        this.floorColor = null;
    }

    public Color getFloorColor() {
        return floorColor;
    }

    private void setFloorColor(Color floorColor) {
        this.floorColor = floorColor;
    }

    public static EventBoxBuilder builder() {
        return new EventBoxBuilder();
    }

    public static class EventBoxBuilder {
        private final EventBox box;

        EventBoxBuilder() {
            this.box = new EventBox();
        }

        public EventBoxBuilder setFloorColor(Color color) {
            box.setFloorColor(color);
            return this;
        }

        public EventBox build() {
            return box;
        }
    }
}
....
scriptUtils.runScript("sc-cfrmd",EventBox.builder().setFloorColor(floorColor).build());

如果您能够使用Lombok Framwork,则可以通过在EventBox类中添加@Builder批注,在编译时自动生成此类生成器

答案 2 :(得分:0)

最基本,最简单的解决方案当然是创建类似的方法

EventBox createFloorEventBox( String floorColor ) {
  EventBox eb = new EventBox();
  eb.setFloorColor( floorColor );
  return eb;
}

并像使用它

scriptUtils.runScript("sc-cfrmd", createEventBox( floorColor ) );

除了构建器模式/方法链接/流利方法外,您还可以考虑在Java中使用lambda,例如

void runScript(String something, Consumer<EventBox> boxInitializer) {
  EventBox eb = new EventBox();
  initializer.apply(eb);
  ...
}

然后像这样称呼

runScript("something", eb -> eb.setFloorColor( floorColor ));