替换连续的if语句

时间:2014-06-26 15:36:42

标签: java android if-statement

在我的代码中,我有很多这样的实例:

if (!valid){
    validate();
}
if (valid){
    \\ execute some code
}

我想知道是否有更好的方法来做到这一点?首先,我必须编写一堆连续的if语句,其次,validate()中的部分代码要求我加载带有登录页面的webview,然后登录,这很烦人。一旦我到达登录页面,我使用JavaScript检索一个值,然后将valid的值更改为true(如果匹配)。没有真正方便的until功能,使用while(!valid)并不能完全满足我的需求。

这是我的validate()

private void validate(){

    class MyJavaScriptInterface {

        @JavascriptInterface
        public void showHTML(String content) {
            // grants access based on authorization level
            loggedIn = true;

            if(content.contains("OK")){
                valid = true;

                Toast.makeText(getApplicationContext(), "Log In Successful",
                        Toast.LENGTH_SHORT).show();
            }else {
                valid = false;

                Toast.makeText(getApplicationContext(), "No Access Granted", Toast.LENGTH_SHORT)
                        .show();
            }
            updateMenuTitles();
        }
    }

    // open up the login page
    final WebView wv = (WebView)findViewById(R.id.login_webview);

    wv.getSettings().setJavaScriptEnabled(true);

    wv.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

    wv.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {

            //once page is finished loading, check id="role" pass that value to showHTML
            if(url.contains(getString(R.string.loginURL))) {
                wv.loadUrl("javascript:(function() { " +
                        "window.HTMLOUT.showHTML(document.getElementById('course-eval-status')" +
                        ".innerHTML);})()");
                wv.setVisibility(View.GONE);
                closeWebview.setVisibility(View.GONE);
            }

        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description,
                                    String failingUrl) {
            Log.w("LoginActivity: ", description);
        }
    });

    wv.loadUrl(getString(R.string.loginURL));
    if(!loggedIn) {
        wv.setVisibility(View.VISIBLE);
        closeWebview.setVisibility(View.VISIBLE);
    }else{
        closeWebview.setVisibility(View.GONE);
        wv.setVisibility(View.GONE);
    }
}

2 个答案:

答案 0 :(得分:0)

你的问题不明确,但这可能是你想要的吗?

boolean valid = false;

private boolean validate() {
    System.out.println("Validating");
    return true;
}

public void test() {
    if (valid || (valid = validate())) {
        System.out.println("Try 1");
    }
    if (valid || (valid = validate())) {
        System.out.println("Try 2");
    }
}

这只会拨打validate一次。但是 - 一个更好的机制就是:

private boolean valid() {
    return valid || (valid = validate());
}

public void test2() {
    if (valid()) {
        System.out.println("Try 1");
    }
    if (valid()) {
        System.out.println("Try 2");
    }
}

答案 1 :(得分:0)

如果validate()更改valid的值,那么我真的没有办法解决这个问题。在我看来,这个问题并不像商业逻辑那么复杂。你提到你的代码"不会等待" - 你不能改变它让它等待吗?如果没有,那么也许你需要一些单元测试来更好地验证你的代码。无论如何,问题似乎与valid标志不同。