87 lines
2.1 KiB
Plaintext
87 lines
2.1 KiB
Plaintext
The creation of a ``++JAXBContext.newInstance++`` is a costly operation, and should only be performed once per context and stored - preferably in a ``++static++`` member - for reuse.
|
|
|
|
|
|
In fact, according to the JAXB 2.2 Specification:
|
|
|
|
____
|
|
To avoid the overhead involved in creating a JAXBContext instance, a JAXB application is encouraged to reuse a JAXBContext instance. An implementation of abstract class JAXBContext is required to be thread-safe, thus, multiple threads in an application can share the same JAXBContext instance.
|
|
____
|
|
|
|
|
|
This rule raises an issue when multiple instances are created for the same context path.
|
|
|
|
|
|
== Noncompliant Code Example
|
|
|
|
[source,java]
|
|
----
|
|
public void doSomething(List<MyObj> inputs) {
|
|
for (String input : inputs) {
|
|
Marshaller m = JAXBContext.newInstance(MyObj.class).createMarshaller(); // Noncompliant; context created in loop
|
|
// ...
|
|
}
|
|
}
|
|
|
|
public List<JAXBContext> getContexts(List<Class> inputs) {
|
|
List<JAXBContext> result = new ArrayList<>();
|
|
for (Class input : inputs) {
|
|
result.add(JAXBContext.newInstance(input); // Compliant; context path varies
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public void doSomething2(List<MyObj> inputs) {
|
|
Marshaller m = JAXBContext.newInstance(MyObj.class).createMarshaller(); // Noncompliant; context created each time method invoked
|
|
for (String input : inputs) {
|
|
// ...
|
|
}
|
|
}
|
|
----
|
|
|
|
|
|
== Compliant Solution
|
|
|
|
[source,java]
|
|
----
|
|
|
|
private static JAXBContext context;
|
|
static {
|
|
try {
|
|
context = JAXBContext.newInstance(MyObj.class);
|
|
} catch (JAXBException e) {
|
|
// handle exception...
|
|
}
|
|
}
|
|
|
|
public void doSomething(List<MyObj> inputs) {
|
|
Marshaller m = context.createMarshaller();
|
|
for (String input : inputs) {
|
|
// ...
|
|
}
|
|
}
|
|
|
|
public List<JAXBContext> getContexts(List<Class> inputs) {
|
|
List<JAXBContext> result = new ArrayList<>();
|
|
for (Class input : inputs) {
|
|
result.add(JAXBContext.newInstance(input);
|
|
}
|
|
return result;
|
|
}
|
|
----
|
|
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
include::message.adoc[]
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::comments-and-links.adoc[]
|
|
endif::env-github,rspecator-view[]
|