-5
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 の両方に、型キャスト以外の同じコード行が含まれています。このコード行を再び共通メソッドに移動する場合は、タイプ キャストを実行して、このプロセスをもう一度実行します。この冗長な行を減らすにはどうすればよいですか?

私は 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);

if 内の python 変数では、 block の外側からもアクセスできるためです。Javaでこれを行うにはどうすればよいですか。

4

6 に答える 6

3

単純

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");
}
于 2012-05-19T11:29:04.100 に答える
2

変数isHttpsチェックが理由(?)であると思います。したがって、2番目のキャストは実際にはあるはずです。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");
于 2012-05-19T11:32:50.273 に答える
2

なぜだめですか:

HttpsURLConnection urlConnection = isHttps
                                 ? (HttpsURLConnection)newURL(url).openConnection()
                                 : (HttpsURLConnection)new URL(url).openConnection();

urlConnection.setDoOutput(true);
// etc.

「前に変数を宣言する」アプローチに対するこれの利点は、if変数が であってもこれが機能することですfinal

于 2012-05-19T11:27:31.657 に答える
1

変数宣言を 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");
于 2012-05-19T11:28:08.580 に答える
0

2つのブロックの違いは何ですか? 使用するだけです:

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");

タイプキャストは特別なことは何もしません。のHttpsURLConnectionサブクラスです。HttpURLConnection

于 2012-05-19T11:34:39.493 に答える
0

if ステートメントの前に変数を宣言し、それに 'null' を割り当てます (変数が初期化されていない可能性があるという警告を回避するため)。次に、疑似コード例のスタイルに従います。

于 2012-05-19T11:27:29.733 に答える