Class NameAllocator
- All Implemented Interfaces:
Cloneable
NameAllocator nameAllocator = new NameAllocator();
for (MyProperty property : properties) {
nameAllocator.newName(property.parameterName(), property);
}
nameAllocator.newName("sb", "string builder");
Pass a unique tag object to each allocation. The tag scopes the parameterName, and can be used to look up
the allocated parameterName later. Typically the tag is the object that is being named. In the above
example we use property for the user-supplied property names, and "string
builder" for our constant string builder.
Once we've allocated names we can use them when generating code:
MethodSpec.Builder builder = MethodSpec.methodBuilder("toString")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(String.class);
builder.addStatement("$1T $2N = new $1T()",
StringBuilder.class, nameAllocator.get("string builder"));
for (MyProperty property : properties) {
builder.addStatement("$N.append($N)",
nameAllocator.get("string builder"), nameAllocator.get(property));
}
builder.addStatement("return $N", nameAllocator.get("string builder"));
return builder.build();
The above code generates unique names if presented with conflicts. Given user-supplied properties
with names ab and sb this generates the following:
@Override
public String toString() {
StringBuilder sb_ = new StringBuilder();
sb_.append(ab);
sb_.append(sb);
return sb_.toString();
}
The underscore is appended to sb to avoid conflicting with the user-supplied sb
property. Underscores are also prefixed for names that start with a digit, and used to replace
parameterName-unsafe characters like space or dash.
When dealing with multiple independent inner scopes, use a clone() of the
NameAllocator used for the outer scope to further refine parameterName allocation for a specific inner
scope.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionclone()Create a deep copy of this NameAllocator.Retrieve a parameterName created withnewName(String, Object).Return a new parameterName usingsuggestionthat will not be a Java identifier or clash with other names.Return a new parameterName usingsuggestionthat will not be a Java identifier or clash with other names.static StringtoJavaIdentifier(String suggestion)
-
Constructor Details
-
NameAllocator
public NameAllocator()
-
-
Method Details
-
toJavaIdentifier
-
newName
Return a new parameterName usingsuggestionthat will not be a Java identifier or clash with other names. -
newName
Return a new parameterName usingsuggestionthat will not be a Java identifier or clash with other names. The returned value can be queried multiple times by passingtagtoget(Object). -
get
Retrieve a parameterName created withnewName(String, Object). -
clone
Create a deep copy of this NameAllocator. Useful to create multiple independent refinements of a NameAllocator to be used in the respective definition of multiples, independently-scoped, inner code blocks.
-