2014-02-11 14 views
8

Ich benutze Java Callable Future in meinem Code. Unten ist mein Haupt-Code, der die Zukunft und Callables verwendet -Soll GSON als statisches Finale deklariert werden?

unter meinem Haupt-Code, die die Zukunft und Callables verwendet -

public class TimeoutThread { 

    public static void main(String[] args) throws Exception { 

     ExecutorService executor = Executors.newFixedThreadPool(5); 
     Future<TestResponse> future = executor.submit(new Task()); 

     try { 
      System.out.println(future.get(3, TimeUnit.SECONDS)); 
     } catch (TimeoutException e) { 

     } 

     executor.shutdownNow(); 
    } 
} 

Unten ist meine Task Klasse, die die aufrufbare Schnittstelle, in denen implementiert Ich mache Ein REST-URL-Aufruf an meine Server unter Verwendung von RestTemplate. Und dann übergebe ich response Variable zu checkString Methode, in der ich die JSON-Schnur deserializing bin und dann überprüfe ich, ob der Schlüssel error oder warning darin hat und dann Grundlage auf diesem bildet ein TestResponse.

class Task implements Callable<TestResponse> { 
    private static RestTemplate restTemplate = new RestTemplate(); 

    @Override 
    public TestResponse call() throws Exception { 

    String url = "some_url";    
    String response = restTemplate.getForObject(url, String.class); 

    TestResponse response = checkString(response); 
    } 
} 

private TestResponse checkString(final String response) throws Exception { 

    Gson gson = new Gson(); // is this an expensive call here, making objects for each and every call? 
    TestResponse testResponse = null; 
    JsonObject jsonObject = gson.fromJson(response, JsonObject.class); // parse, need to check whether it is an expensive call or not. 
    if (jsonObject.has("error") || jsonObject.has("warning")) { 

     final String error = jsonObject.get("error") != null ? jsonObject.get("error").getAsString() : jsonObject 
      .get("warning").getAsString(); 

     testResponse = new TestResponse(response, "NONE", "SUCCESS"); 
    } else { 
     testResponse = new TestResponse(response, "NONE", "SUCCESS"); 
    } 

    return testResponse; 
} 

Also meine Frage ist, wie sollte ich GSON hier erklären? Sollte es als statische finale globale Variable in meiner Task-Klasse deklariert werden? Bcoz derzeit analysiere ich JSON mit gson und für jeden Anruf mache ich was wäre teuer oder nicht?

+0

Siehe http://stackoverflow.com/questions/10380835/is-it-ok-to-use-gson-instance-as-a-static-field-in-a-model-bean-reuse – Vadzim

Antwort

13

Das Objekt ist explizit sicher aus mehreren Threads zu verwenden, da es keinen internen Status behält, also ja, deklarieren Sie private static final Gson GSON = new Gson();, oder machen Sie es sogar public. Wenn Sie möchten, dass Ihr Client-Code das Rendering mithilfe von GsonBuilder anpassen kann, sollten Sie ein Objekt als Parameter akzeptieren.

+2

+1 : Hier ist das offizielle Wort über die Aufrechterhaltung eines Staates während JSON-Operationen https://sites.google.com/site/gson/gson-user-guide#TOC-Using-Gson – PopoFibo

+0

@PopoFibo Ging nach dieser genauen Passage und scrollte direkt daneben ... – chrylis

+0

@chrylis: Können Sie auf Ihrem zweiten Punkt für GsonBuilder erklären, wie ich es vorher nicht benutzt habe, also weiß nicht darüber. oder wenn Sie ein Beispiel dafür geben können, dann wird es eine große Hilfe sein. – AKIWEB

0

Die Gson-Bibliothek kann auf Klassenebene definiert und überall verwendet werden, da sie den Zustand zwischen verschiedenen Aufrufen nicht aufrechterhält. Da der Status nicht beibehalten wird, können Sie ihn einmal deklarieren und überall verwenden (eine Zeile weniger Code, wenn Sie ihn erneut verwenden müssen). Multi-Threading hat keinen Einfluss darauf. Ein anderer Hinweis: Wenn man sich die Leistungsmesswerte in der offiziellen Dokumentation ansieht, scheint es kein teurer Anruf zu sein.

Verwandte Themen