GSON 是否应该声明为静态 final?

2022-09-04 19:19:17

我在我的代码中使用Java Callable Future。以下是我的主要代码,它使用future和可调用性 -

以下是我的主要代码,它使用future和可调用性 -

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();
    }
}

下面是我的类,它实现了可调用接口,其中我使用 对我的服务器进行 REST URL 调用。然后,我将变量传递给我正在反序列化JSON字符串的方法,然后我正在检查密钥是否具有或在其中,然后基于该方法制作.TaskRestTemplateresponsecheckStringerrorwarningTestResponse

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;
}

所以我的问题是我应该如何在这里声明?是否应将其声明为 Task 类中的静态最终全局变量?因为目前我正在使用gson解析JSON,对于我所做的每个调用,哪一个是昂贵的还是不昂贵的?GSONnew Gson()


答案 1

该对象在多个线程中使用是显式安全的,因为它不保留任何内部状态,因此是的,声明一个 ,甚至使其成为 。Gsonprivate static final Gson GSON = new Gson();public

请注意,如果希望客户端代码能够使用 自定义呈现,则应接受对象作为参数。GsonBuilderGson


答案 2

Gson 库可以在类级别定义,并且可以在任何地方使用,因为它不会在不同的调用之间维护状态。由于它不维护状态,因此您可以声明一次,然后在任何地方使用它(如果需要重用它,可以少写一行代码)。多线程对它没有影响。另一方面,从官方文档中的性能指标来看,它似乎并不是一个昂贵的调用。