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 使用模型类实现方法链接(fluent接口)的最佳方法_Java_Model View Controller_Java 8_Fluent Interface_Method Chaining - Fatal编程技术网

Java 使用模型类实现方法链接(fluent接口)的最佳方法

Java 使用模型类实现方法链接(fluent接口)的最佳方法,java,model-view-controller,java-8,fluent-interface,method-chaining,Java,Model View Controller,Java 8,Fluent Interface,Method Chaining,如何在web应用程序中实现模型类的方法链接 我有干净的POJO模型课: public class MyModel { private String property; public String getFirstProperty() { return property; } public void setFirstProperty(String firstProperty) { this.property = firstProp

如何在web应用程序中实现模型类的方法链接

我有干净的POJO模型课:

public class MyModel {
    private String property;

    public String getFirstProperty() {
        return property;
    }

    public void setFirstProperty(String firstProperty) {
        this.property = firstProperty + "blah blah";
    }

}
我想添加两种方法。我应该在哪里添加它们

public MyModel doSomething(String something) {
    property += something + "blah";
    return this;
}

public MyModel doAntyhing(String antyhing) {
    property += antyhing + "blah blah";
    return this;
}
我想这样使用它们:

MyModel myModel = new MyModel();
myModel.doAntyhing("blah").doAntyhing("blah blah");
void applyModifiers( ModelModifier ... modifiers) {
    Stream.of( modifiers ).forEach( m -> m.apply(this) );
}

下面是我拙劣、丑陋的解决方案。如何做得更好


第一种方法。简单的方法,但对于模型类来说非常难看(它们应该是干净的,没有逻辑应用程序):

我想把这两个方法移到另一个类

public class LogicForMyModel {
    public MyModel doSomething(String something) {
        property += something + "blah";
        return this;
    }

    public MyModel doAntyhing(String antyhing) {
        property += antyhing + "blah blah";
        return this;
    }
}
但是如何将这两个类连接起来呢?也许我应该使用继承或接口?怎么做

interface ILogicModel {
    public MyModel doSomethingLogic(String something);
    public MyModel doAntyhingLogic(String antyhing);
}

第二种方法。使用“构建器”(基于的解决方案)

然后我可以使用它(可能build()与Java 8中的stream()类似):

这比第一次更好。但我必须使用build()方法。我想为MyModel而不是Builder调用方法(如C#中的LINQ)

这是做得更好的方法吗



第三个。使用库。但我不想每天都使用外部库。否则,以这种方式,我必须使用第二种方式构建的方法

您还可以创建如下功能界面:

interface ModelModifier {
    void apply(MyModel model);
}
然后,实现您需要的一些修改器:

static ModelModifier doSomething(String something) {
    return model -> model.setProperty(something + "blah");
}

static ModelModifier doAntyhing(String anything) {
    return model -> model.setAnything(anything);
}
并在某处添加一个应用修饰符的方法,可能直接在MyModel类中,如下所示:

MyModel myModel = new MyModel();
myModel.doAntyhing("blah").doAntyhing("blah blah");
void applyModifiers( ModelModifier ... modifiers) {
    Stream.of( modifiers ).forEach( m -> m.apply(this) );
}
现在,你可以打电话了

mymodel.applyModifiers( doSomething( "blah" ), doAnything( "blahblah") );

它并不完全是方法链接,但可以使用它来代替方法链接

仅当这些方法实际上用于构建模型对象时,才应使用builder。也许你应该给我们提供更多关于这些方法的内容。这是一个具有模型属性之一的简单操作吗?这是商业逻辑吗?我看不出有什么值得讨论的。在一种情况下,您在一个类中实现了某种逻辑,在第二种情况下,您在两个类中实现了相同的逻辑。逻辑没有改变,因此两个变体都不比另一个好。如果您真的认为,一个类中的方法数量很重要(比类的数量更重要),那么,将方法分布到两个或多个类上。如果不行,那就随你的便。没有真正的区别。
doSomething
/
doAnything
方法应该是静态的,以便像这样使用(使用静态导入)。另外,由于您的
apply()
方法具有
void
返回类型,因此应该删除
return null
。@didierr您完全正确,我修复了这个问题
mymodel.applyModifiers( doSomething( "blah" ), doAnything( "blahblah") );