【问题标题】:How to reduce redundant coding in java?如何减少java中的冗余编码?
【发布时间】:2012-05-26 17:51:34
【问题描述】:
public static byte[] sendRequest(String url ,Object params ,boolean isHttps){
        if(isHttps){
            HttpsURLConnection urlConnection = (HttpsURLConnection)newURL(url).openConnection();
            urlConnection.setDoOutput(true);
            urlConnection.setDoInput(true);
            urlConnection.setRequestMethod("POST");
            urlConnection.setConnectTimeout(5000);
            urlConnection.setReadTimeout(60000);
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
       }

        }else{
            HttpURLConnection urlConnection = (HttpURLConnection)new URL(url).openConnection();
            urlConnection.setDoOutput(true);
            urlConnection.setDoInput(true);
            urlConnection.setRequestMethod("POST");
            urlConnection.setConnectTimeout(5000);
            urlConnection.setReadTimeout(60000);
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");

        }


}

在这两个 if 和 else 在类型转换旁边包含相同的代码行。如果我再次将这行代码移到一个通用方法中,我想键入 cast 并再次执行此过程。我怎样才能减少这些多余的行,任何人都可以帮助我。

我在 python 中有一个解决方案。

     //pseudo code .
     if(isHttps) :
           urlConnection = https . 
     else : 
         urlConnection = http .
     urlConnection.setDoOutput(true);
     urlConnection.setDoInput(true);
     urlConnection.setRequestMethod("POST");
     urlConnection.setConnectTimeout(5000);
     urlConnection.setReadTimeout(60000);

因为在 python 变量中的 if 也可以从外部访问 block 。在java中我该怎么做。

【问题讨论】:

  • 在jave中做同样的事情,它会工作
  • 不是你的“HttpsURLConnection urlConnection = (HttpsURLConnection)new URL(url).openConnection();”两种情况下的行相同吗?
  • 我认为kannan不知道他可以在if块之前声明一个变量

标签: java python optimization


【解决方案1】:

简单

public static byte[] sendRequest(String url ,Object params ,boolean isHttps){
     HttpsURLConnection urlConnection;
     if(isHttps){
         urlConnection = (HttpsURLConnection)newURL(url).openConnection();
      }else{
         urlConnection = (HttpURLConnection)new URL(url).openConnection();
      }
         urlConnection.setDoOutput(true);
         urlConnection.setDoInput(true);
         urlConnection.setRequestMethod("POST");
         urlConnection.setConnectTimeout(5000);
         urlConnection.setReadTimeout(60000);
         urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
}

【讨论】:

    【解决方案2】:

    将变量声明放在 if 块之前

    HttpsURLConnection urlConnection;
    if (isHttps) {
        urlConnection= (HttpsURLConnection) new URL(url).openConnection();
    } else {
        urlConnection = (HttpsURLConnection) new URL(url).openConnection();
    }
    urlConnection.setDoOutput(true);
    urlConnection.setDoInput(true);
    urlConnection.setRequestMethod("POST");
    urlConnection.setConnectTimeout(5000);
    urlConnection.setReadTimeout(60000);
    urlConnection.setRequestProperty("Content-Type",
            "application/x-www-form-urlencoded;charset=UTF-8");
    

    【讨论】:

      【解决方案3】:

      这两个块有什么区别?只需使用:

      HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
      urlConnection.setDoOutput(true);
      urlConnection.setDoInput(true);
      urlConnection.setRequestMethod("POST");
      urlConnection.setConnectTimeout(5000);
      urlConnection.setReadTimeout(60000);
      urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
      

      你的类型转换没有什么特别的。 HttpsURLConnectionHttpURLConnection 的子类

      【讨论】:

      • 抱歉错字。否则块不是 HttpsURLConnection 它是 HttpUrlConnection。
      • 仍然无关紧要。类型转换实际上对您正在转换的对象没有任何作用。上面的代码应该可以工作,因为HttpsURLConnectionHttpURLConnection 的子类,所以不需要if 语句。
      【解决方案4】:

      我认为isHttps 变量检查是有原因的(?),因此第二个演员实际上应该是HttpURLConnection,这意味着问题中有错字吗? 如果是这样,则问题中使用的大多数方法都可以在父类 URLConnection 中使用,而无需强制转换,但不是全部。

      幸运的是 HttpsURLConnection 是 HttpUrlConnection 的一个子类,所以只要始终转换为它就可以在这里工作,全部替换为(不需要 isHttps 检查):

      HttpURLConnection urlConnection = (HttpURLConnection)new URL(url).openConnection();
      urlConnection.setDoOutput(true);
      urlConnection.setDoInput(true);
      urlConnection.setRequestMethod("POST");
      urlConnection.setConnectTimeout(5000);
      urlConnection.setReadTimeout(60000);
      urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
      

      【讨论】:

      • 大家好,非常感谢您的回答。对不起我的疏忽。从我的问题 else{ HttpsURLConnection urlConnection = (HttpsURLConnection)new URL(url).openConnection(); } 它不是 HttpsUrlConnection 它是 HttpUrlConnection 。
      【解决方案5】:

      为什么不:

      HttpsURLConnection urlConnection = isHttps
                                       ? (HttpsURLConnection)newURL(url).openConnection()
                                       : (HttpsURLConnection)new URL(url).openConnection();
      
      urlConnection.setDoOutput(true);
      // etc.
      

      与“在if 之前声明变量”方法相比,此方法的优点是即使变量为final 也可以使用。

      【讨论】:

        【解决方案6】:

        在 if 语句之前声明变量,并为其分配“null”(以避免警告变量可能未初始化)。然后按照您的伪代码示例中的样式进行操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多