2012-05-09 17 views
1

私はJava EEクライアントを作成しています。ここでは、応答を得るためにノード(js)サーバーを呼び出す必要があります。そこで私はノード・サーバーに対して要求を行うための単一のクラスを作成しました。 私は応答を得るたびに、応答コードと応答自体を返信する必要があります。だから私はレスポンスコードと応答を含む文字列配列を作成することを考えました。Map <Integer、String>またはString []?

import javax.ws.rs.core.MediaType; 

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.ClientResponse; 
import com.sun.jersey.api.client.WebResource; 
import com.sun.jersey.api.client.config.ClientConfig; 
import com.sun.jersey.api.client.config.DefaultClientConfig; 
import com.sun.jersey.api.client.filter.LoggingFilter; 
import com.sun.jersey.core.impl.provider.entity.StringProvider; 

public class RequestHandler { 

/** 
* Makes a HTTP Request for a given url. The type 
* determines which type of request, post or get, 
* will be made. The params cane be in form of 
* name=value pair or JSON format. 
* 
* @param type Request method. 1 - Get, 2 - Post. 
* @param url url string to which request has to be 
* made. 
* @param path path of the resource or service for a 
* url. 
* @param params request parameters. Can be either 
* name=value pair or JSON request. 
* 
* @return String representation of the response. 
* 
*/ 
public static String[] makeRequest(int type, String url, String path, String params) { 
    String[] response = new String[2]; 
    ClientResponse clientResponse = null; 
    try { 
     ClientConfig config = new DefaultClientConfig(); 
     config.getClasses().add(StringProvider.class); 
     Client client = Client.create(config); 

     WebResource service = 
       client.resource(url); 
     client.addFilter(new LoggingFilter()); 
     service.path("rest"); 

     // 1 - GET, 2 - POST 
     switch (type) { 
      case 1: { 
       System.out.println("Making GET request to: " + url + path); 
       System.out.println("Request Params: " + params); 
       clientResponse = service.path(path).type(MediaType.APPLICATION_JSON_TYPE).accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); //TODO Code to be corrected, include params 
       break; 
      } 
      case 2: { 
       System.out.println("Making POST request to: " + url + path); 
       System.out.println("Request Params: " + params); 
       clientResponse = service.path(path).type(MediaType.APPLICATION_JSON_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, params); 
       break; 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     response[0] = "500"; 
     response[1] = "Internal Server Error"; 
     return response; 
    } 

    response[0] = String.valueOf(clientResponse.getStatus()); 
    response[1] = clientResponse.getEntity(String.class); 

    System.err.println("Response status: " + response[0]); 

    return response; 
    }//end of makeRequest() 

}//end of class 

しかし、私はパフォーマンスの問題を引き起こすすぎて文字列オブジェクトを作成することで納得していない午前:ここ

は私のクラスです。そこで私は、レスポンスコードとレスポンスを返すMapを作成することを考えました。

response.put(500, "Internal Server Error"); 

しかし、再び、整数でマップを作成し、毎回応答コードをチェックすること再びパフォーマンスにつながる可能性がIntegerオブジェクトのボックス化とアンボックス化のオーバーヘッドを作成します。

HashMap<Integer, String> response = RequestHandler.makeRequest(2, urlString, "/login", params); 

if (response.containsKey(500)) { 
return Message.INTERNAL_SERVER_ERROR; 
} 

パフォーマンスを向上させるにはどちらを使用しますか?それとももっと良い選択肢がありますか?

答えて

3

HashMap、アレイ、プラスのハウスキーピングアイテムの束(サイズ、しきい値、負荷率)が含まれ、String[]アレイはより小さくなるだろう(そしてしたがって、一小節によって、より効率的な)HashMapよりことを考えます。

ただし、premature optimisationは避けてください。

+2

+1回避時期尚早な最適化 –

1

いずれにしても性能の違いはほとんどないと思います。しかし、わかりやすくするために、手近なすべての可能なコードをすでに知っているので、Enumsまたはstatic finalという変数を使用することをお勧めします。 HashMapは、データを動的に追加/削除する必要がある場合には有効ですが、この場合は適用されません。

0

は、私はあなたがこのように、独自のレスポンスオブジェクトを定義することができると思います。

class Response{ 
    int status; 
    String msg; 
} 
+0

ために、私はその必要はないと思います。.. – Vishal

関連する問題