2012-05-09 67 views
1

我正在创建一个Java EE客户端,我需要调用一个节点(js)服务器来获取响应。所以我做了一个类,通过它向节点服务器发出请求。 每次我收到回复时,我都需要发送回应代码和回复本身。所以我想创建一个包含响应代码和响应的String数组。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

我不认为这种方式在性能上有很大差异。但为了清晰起见,我建议使用Enumsstatic final变量,因为您事先已经知道所有可能的代码。如果需要动态添加/删除数据,HashMap会很好,但在这种情况下不适用。

0

我认为,你可以这样定义自己的响应对象:

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

我认为它不是必要.. – Vishal

相关问题