4/28/2009

Use string constants in annotations

Generally speaking, string literals should be replaced with string constants in source code. This rule also holds when it comes to annotation-based resource injections.

For field or setter injections, any string constants can be declared in the enclosing class. The following example shows how to declare an env-entry in web.xml and inject it to a servlet class.

public static final String ADMIN_EMAIL = "adminEmail";

@Resource(name=ADMIN_EMAIL)
private String adminEmail;

<env-entry>
<description>admin email</description>
<env-entry-name>adminEmail</env-entry-name>
<env-entry-value>admin@example.x</env-entry-value>
</env-entry>
The name attribute is mandatory and used to match this injection to the appropriate env-entry in web.xml. This env-entry can be injected into several other classes, and therefore it is desirable to declare its name as a constant. This string constant may also reside in a separate class (e.g., a Constants class, utility class, or even some interface), depending on how it is used.

For type-level injections, these string constants must be declared in a separate class in order to be referenced in type-level annotations. This is probably because any field declarations have not be parsed when type-level annotations in the same class are processed. The follwoing example shows how to inject a stateful EJB reference at a servlet class level.
import static test.Constants.FOO_EJB_NAME;
import static test.Constants.FOO_EJB_REF_NAME;

@EJB(name=FOO_EJB_REF_NAME, beanName=FOO_EJB_NAME, beanInterface=FooBean.class)
public class Servlet2 extends HttpServlet {...}
In the above injection, beanName is optional only if there is only one EJB with business interface FooBean, and hence no ambiguity in mapping the EJB reference to target EJB. name and beanInterface attributes are always required when the @EJB injection is used at type level.

4 comments:

Jigar Shah said...

Is there any performance enhancement for using annotations with constants ? For example,

@Path(SOME_CONST)
function getData() {

}

Now, here this constant is not likely going to get use anywhere else. (So advantage where value of constant changes one place and gets changed at others is not really useful)

Steve Smith said...

Great and Useful Article.

Online Java Training

Java Online Training India

Java Online Course

Java EE course

Java EE training

Best Recommended books for Spring framework

Java Interview Questions








Java Course in Chennai

Java Online Training India

Paul Smith said...

Howdy! In fact, string literals should be replaced with string constants in source code. This rule also holds when it comes to annotation-based resource injections. P.S. The best custom essay writing service will help you with any academic topic!

Vũ Diệu Linh said...

I enjoyed on reading your blog post. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. Please visit my website, Friv 4000 Games is where all the free friv games.
Friv 4000