Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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方法中使用动态代码?_Java_Dynamic_Methods_Redundancy - Fatal编程技术网

如何在java方法中使用动态代码?

如何在java方法中使用动态代码?,java,dynamic,methods,redundancy,Java,Dynamic,Methods,Redundancy,我有几乎冗余的java方法。这些方法的主体总是相同的。只有一个或两个java表达式(java代码行)不同。我想对这些几乎冗余的方法进行代码重构,但我正在寻找最好的方法。这并不容易,因为动态代码行 以下三种方法具有相同的主体,但其中包含动态java代码: public static final boolean doSomething1() { Date date = new Date(); long currentTime = date.getTime(); long ma

我有几乎冗余的java方法。这些方法的主体总是相同的。只有一个或两个java表达式(java代码行)不同。我想对这些几乎冗余的方法进行代码重构,但我正在寻找最好的方法。这并不容易,因为动态代码行

以下三种方法具有相同的主体,但其中包含动态java代码:

public static final boolean doSomething1() {
    Date date = new Date();
    long currentTime = date.getTime();
    long maxTime = currentTime + (TIMEOUT * 1000);

    while (currentTime < maxTime) { 
        try {
            //START OF MY DYNAMIC CODE
            //example 1
            for (WebElement element : list) {
                if (element.isDisplayed()) {
                    element.click();
                    return true;
                }                   
            }
            //END OF MY DYNAMIC CODE
        }
        catch (Exception e) {
            LOG.error("exception");
        }
        currentTime = new Date().getTime();
    }

    return false;
}

public static final boolean doSomething2() {
    Date date = new Date();
    long currentTime = date.getTime();
    long maxTime = currentTime + (TIMEOUT * 1000);

    while (currentTime < maxTime) { 
        try {
            //START OF MY DYNAMIC CODE
            //example 2
            for (WebElement webElement : webElementList) {   
                WebElement parent = getParentElement(webElement);
            }
            return true;
            //END OF MY DYNAMIC CODE
        }
        catch (Exception e) {
            LOG.error("exception");
        }
        currentTime = new Date().getTime();
    }

    return false;
}

public static final boolean doSomething3() {
    Date date = new Date();
    long currentTime = date.getTime();
    long maxTime = currentTime + (TIMEOUT * 1000);

    while (currentTime < maxTime) { 
        try {
            //START OF MY DYNAMIC CODE
            //example 3
            for (WebElement element : list) {
                if (element.isDisplayed() && element.getText().equalsIgnoreCase(size))
                    return true;
            }
            //END OF MY DYNAMIC CODE
        }
        catch (Exception e) {
            LOG.error("exception");
        }
        currentTime = new Date().getTime();
    }

    return false;
}       
public静态最终布尔值doSomething1(){
日期=新日期();
long currentTime=date.getTime();
长最大时间=当前时间+(超时*1000);
而(currentTime

那么,如何编写一个有机会设置代码动态行的方法呢?

传递一个布尔参数,该参数的值是
X==true
的第一个操作数(更容易写成
X
):


您有几个选择:

  • 面向方面编程
  • 战略设计模式
  • jdk8中的Lambdas
  • 我更喜欢最后一个。现在每个人都应该使用JDK 8了

    我希望这样的代码行只是仓促编写的糟糕示例,而不是您编写的典型方式:

            if (true == true)
    
    使用:

    你可以用这个

    使用as策略的示例:

    private static boolean doSomethingHelper(BooleanSupplier checker) { 
        Date date = new Date();
        long currentTime = date.getTime();
        long maxTime = currentTime + (TIMEOUT * 1000);
    
        while (currentTime < maxTime) { 
            try {
                if (checker.getAsBoolean())
                    return true;
            }
            catch (Exception e) {
                LOG.error("exception");
            }
            currentTime = new Date().getTime();
        }
    
        return false;
    }
    
    public static boolean doSomething1() {
        return doSomethingHelper(() -> true);
    }
    
    public static boolean doSomething2() {
        return doSomethingHelper(() -> false);
    }
    
    public static boolean doSomething3() {
        return doSomethingHelper(() -> {
            System.out.println("test");
            return true;
        });
    }
    
    private静态布尔doSomethingHelper(布尔供应商检查器){
    日期=新日期();
    long currentTime=date.getTime();
    长最大时间=当前时间+(超时*1000);
    而(currentTimetrue);
    }
    公共静态布尔值doSomething2(){
    返回doSomethingHelper(()->false);
    }
    公共静态布尔值doSomething3(){
    回程剂量仪(()->{
    系统输出打印(“测试”);
    返回true;
    });
    }
    
    这只是一个简单的例子来说明我的问题。我的真实代码不一样;)@Martin试着第一次问你想要回答的问题。我们的代码中哪一部分应该是“动态的”?没有办法使
    if(false==true)
    动态。您唯一能做的就是使if语句中的条件成为动态的。但在上一次考试中,有两条动态线
    System.out.println(“test”);如果(“test”.equals(“test”))
    ,这根本不起作用。我更改了代码,以便更清楚地说明我的意思。
    abstract class DynamicImpl {
    
        protected abstract boolean doSomethingImpl();
    
        public final boolean doSomething() {
            Date date = new Date();
            long currentTime = date.getTime();
            long maxTime = currentTime + (TIMEOUT * 1000);
    
            while (currentTime < maxTime) { 
                try {
                    if (doSomethingImpl()) {
                        return true;
                    }
                }
                catch (Exception e) {
                    LOG.error("exception");
                }
                currentTime = new Date().getTime();
            }
            return false;
        }
    }
    
    private static final DynamicImpl d1 = new DynamicImpl() {
        protected boolean doSomethingImpl() {
            return true;
        }
    };
    
    private static final DynamicImpl d2 = new DynamicImpl() {
        protected boolean doSomethingImpl() {
            return false;
        }
    };
    
    private static final DynamicImpl d3 = new DynamicImpl() {
        protected boolean doSomethingImpl() {
            System.out.println("test")
            return true;
        }
    };
    
    public static final boolean doSomething1() {
        return d1.doSomething();
    }
    public static final boolean doSomething2() {
        return d2.doSomething();
    }
    public static final boolean doSomething3() {
        return d3.doSomething();
    }
    
    private static boolean doSomethingHelper(BooleanSupplier checker) { 
        Date date = new Date();
        long currentTime = date.getTime();
        long maxTime = currentTime + (TIMEOUT * 1000);
    
        while (currentTime < maxTime) { 
            try {
                if (checker.getAsBoolean())
                    return true;
            }
            catch (Exception e) {
                LOG.error("exception");
            }
            currentTime = new Date().getTime();
        }
    
        return false;
    }
    
    public static boolean doSomething1() {
        return doSomethingHelper(() -> true);
    }
    
    public static boolean doSomething2() {
        return doSomethingHelper(() -> false);
    }
    
    public static boolean doSomething3() {
        return doSomethingHelper(() -> {
            System.out.println("test");
            return true;
        });
    }