gpt4 book ai didi

java - 链式方法设计

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:38 25 4
gpt4 key购买 nike

我写了一个简单的类来演示链式方法设计:

public class Cal {

private Cal(){}

private boolean isCheckArguments = false;

public static Cal useAbs() {
return new Cal(){
@Override int check(int i) {
return Math.abs(i);
}};
}

public static Cal useNormal() {
return new Cal();
}

public Cal checkArguments() {
isCheckArguments =true;
return this;
}

int check(int i){ return i;}

public int plus(int i, int j) {
if(isCheckArguments && i<j){
throw new IllegalArgumentException("i<j!");
}
return check(i+j);
}
}

所以客户端代码可以是:

Cal cal = Cal.useAbs().checkArguments();
int sum = cal.plus(100,2);//IllegalArgumentException occurs

Cal cal2 = Cal.useAbs();
int sum2 = cal.plus(-100,2);//98

Cal cal3 = Cal.useNormal();
int sum3 = cal.plus(-100,2);//-98

我的问题是:这样的设计合理吗?比较:int plus(int a, int b, boolean useAbs, boolean checkArguments)。谢谢!

最佳答案

听起来您想要一个流畅的界面来构建服务类。 Guava 做类似的事情。你会做这样的事情:

public interface Cal {
int plus(int a, int b);
}

public class CalBuilder {
class InternalCal implements Cal {
boolean useAbs;
boolean checkArgs;
public int plus(int a, int b) {
if(checkArgs) {
// blah, blah blah
}
if(useAbs) {
// doodle bug, doodle darn
}
return a+b; // whatevs
}
}
boolean absSet=false;
InternalCal holder=new InternalCal();
public CalBuilder useNormal() {
if(absSet) { throw new IllegalArgumentException(); } // already called
holder.useAbs=false;
absSet=true;
return this;
}

public CalBuilder useAbs() {
if(absSet) { throw new IllegalArgumentException(); } // already called
holder.useAbs=false;
absSet=true;
return this;
}

public CalBuilder checkArguments() {
if(holder.checkArgs) { throw new IllegalArgumentException(); }
holder.checkArgs=true;
return this;
}

public Cal build() {
return holder;
}
}

用法看起来像这样:

Cal cal=new CalBuilder().useAbs().checkArguments().build();
int sum=cal.plus(1,2);

关于java - 链式方法设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5779918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com