Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 将if-else替换为OO-aproach_Java_Oop_If Statement - Fatal编程技术网

Java 将if-else替换为OO-aproach

Java 将if-else替换为OO-aproach,java,oop,if-statement,Java,Oop,If Statement,假设我有: if (count <= instance.getFCount()) { //do something and return String } else if (count <= instance.getFSCount()) { //do something and return String } else if (count <= instance.getTCount()) { //do something and return Strin

假设我有:

if (count <= instance.getFCount()) {
    //do something and return String
} else if (count <= instance.getFSCount()) {
    //do something and return String
} else if (count <= instance.getTCount()) {
    //do something and return String
} else if (count <= instance.getOCount()) {
    //do something and return String
}
我正在考虑如何将此代码替换为更面向对象的代码。问题是如果我有这样的陈述:

if (count <= 0) {
    //do something and return String
} else if (count <= 1) {
    //do something and return String
} else if (count <= 2) {
    //do something and return String
} else if (count <= 3) {
    //do something and return String
}
我可以用一些工厂模式或基于枚举的方法来替换它,因为我的值0、1、2、3总是静态的。例如,我将创建一个映射,以根据数字保存类,然后如果我的计数为0,我将知道我需要从映射为零的类创建一个实例,以此类推

但是现在我在想,如果在if条件下没有静态值,是否有什么方法可以做到,因为例如,返回给这个的内容:instance.getOCount可能会根据配置的不同而有所不同


你能给我一些想法如何做到这一点吗?

当你有很多不同的if-else语句时,你可以使用一个。这有助于您创建符合最佳实践的可管理代码。

我认为没有必要用设计模式替换如此简单的逻辑,这是不合理的。假设count是一个整数,切换是一种改进,但是为什么要创建一堆类呢?只有当每一个都有额外的、不同的行为时,它才是合理的。

如果您使用一个NavigableMap,例如树映射,键是您的阈值,值是可调用的,那么您将能够检索适当的可调用项并调用它,所有这些都在一行程序中。相关方法为NavigableMapceilingEntry


我不认为使用模式是这里的解决方案…所有的东西都比你的原始代码更难阅读。但如果您确定,这是一种选择: 假设您的实例属于类用户。创建一个接口

public interface IDynamicAction<T> {
boolean select(T t);
String action(T t);
}
列一张清单

List<IDynamicAction<User>> actions = new ArrayList<IDynamicAction<User>>();
actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getFSCount();
}

@Override
public String action(User t) {
    System.out.println("count <= instance.getFSCount()");
    return "count <= instance.getFSCount()";
}
});


actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getTCount();
}
@Override
public String action(User t) {
    System.out.println("count <= instance.getTCount()");
    return " count <= instance.getTCount()";
}
});

actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getOCount();
}
@Override
public String action(User t) {
    System.out.println("count <= instance.getOCount()");
    return " count <= instance.getOCount()";
}
});
并使用

for(IDynamicAction<User> action : actions){
if(action.select(instance)){
    String s = action.action(instance);
    System.out.println(s);
    break;
}
}

请注意,我假设在您的代码中只有一个操作可以执行 如果不需要返回值,可以使用抽象类而不是接口,并执行ifselect操作;作为AbstractDynamicAction类的一部分,代码会更好


Java7并不能真正帮助完成这类工作。闭包会让事情看起来更简单……但是,依我看,你原来的多重IF才是最好的选择。

多态性的诞生是为了消除switch和IF/else链。它将如何帮助不基于检查实例的IF链???@dasblinkenlight-正是,谢谢。克里斯·库尼-你有没有把我的问题读到最后?我可以在我给出的第二个例子中使用策略模式。如何使用if条件运算符后面的if值?记住为将来的读者标记正确答案。然而,在这个例子中,没有一个正确的答案。它的数据建模和设计;而不是数学发展这是一个古老的答案,但正确问题的正确设计模式=一个永恒的解决方案。正是我要找的模式,谢谢。@MarkoTopolnik表示当前值是静态的,因为开关可能会工作,我们不知道count是否为整数。对于动态值的假设场景,您是对的。
for(IDynamicAction<User> action : actions){
if(action.select(instance)){
    String s = action.action(instance);
    System.out.println(s);
    break;
}