/*
* Copyright 2014 - 2020 Rafael Winterhalter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.bytebuddy.description.enumeration;
import net.bytebuddy.build.CachedReturnPlugin;
import net.bytebuddy.description.NamedElement;
import net.bytebuddy.description.type.TypeDescription;
import java.util.ArrayList;
import java.util.List;
Describes an enumeration value. Note that the Object.toString
method always returns the value as if the method was not overridden, i.e. the name of the enumeration constant. /**
* Describes an enumeration value. Note that the {@link java.lang.Object#toString} method always returns the
* value as if the method was not overridden, i.e. the name of the enumeration constant.
*/
public interface EnumerationDescription extends NamedElement {
Returns the name of this instance's enumeration value.
Returns: The name of this enumeration constant.
/**
* Returns the name of this instance's enumeration value.
*
* @return The name of this enumeration constant.
*/
String getValue();
Returns the type of this enumeration.
Returns: The type of this enumeration.
/**
* Returns the type of this enumeration.
*
* @return The type of this enumeration.
*/
TypeDescription getEnumerationType();
Prepares this enumeration value to be loaded.
Params: - type – A type constant representing the enumeration value.
Type parameters: - <T> – The enumeration type.
Returns: The loaded enumeration constant corresponding to this value.
/**
* Prepares this enumeration value to be loaded.
*
* @param type A type constant representing the enumeration value.
* @param <T> The enumeration type.
* @return The loaded enumeration constant corresponding to this value.
*/
<T extends Enum<T>> T load(Class<T> type);
An adapter implementation of an enumeration description.
/**
* An adapter implementation of an enumeration description.
*/
abstract class AbstractBase implements EnumerationDescription {
{@inheritDoc}
/**
* {@inheritDoc}
*/
public String getActualName() {
return getValue();
}
@Override
@CachedReturnPlugin.Enhance("hashCode")
public int hashCode() {
return getValue().hashCode() + 31 * getEnumerationType().hashCode();
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
} else if (!(other instanceof EnumerationDescription)) {
return false;
}
EnumerationDescription enumerationDescription = (EnumerationDescription) other;
return getEnumerationType().equals(enumerationDescription.getEnumerationType()) && getValue().equals(enumerationDescription.getValue());
}
@Override
public String toString() {
return getValue();
}
}
An enumeration description representing a loaded enumeration.
/**
* An enumeration description representing a loaded enumeration.
*/
class ForLoadedEnumeration extends AbstractBase {
The loaded enumeration value.
/**
* The loaded enumeration value.
*/
private final Enum<?> value;
Creates a new enumeration value representation for a loaded enumeration.
Params: - value – The value to represent.
/**
* Creates a new enumeration value representation for a loaded enumeration.
*
* @param value The value to represent.
*/
public ForLoadedEnumeration(Enum<?> value) {
this.value = value;
}
Enlists a given array of loaded enumerations as enumeration values.
Params: - enumerations – The enumerations to represent.
Returns: A list of the given enumerations.
/**
* Enlists a given array of loaded enumerations as enumeration values.
*
* @param enumerations The enumerations to represent.
* @return A list of the given enumerations.
*/
public static List<EnumerationDescription> asList(Enum<?>[] enumerations) {
List<EnumerationDescription> result = new ArrayList<EnumerationDescription>(enumerations.length);
for (Enum<?> enumeration : enumerations) {
result.add(new ForLoadedEnumeration(enumeration));
}
return result;
}
{@inheritDoc}
/**
* {@inheritDoc}
*/
public String getValue() {
return value.name();
}
{@inheritDoc}
/**
* {@inheritDoc}
*/
public TypeDescription getEnumerationType() {
return TypeDescription.ForLoadedType.of(value.getDeclaringClass());
}
{@inheritDoc}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
public <T extends Enum<T>> T load(Class<T> type) {
return value.getDeclaringClass() == type
? (T) value
: Enum.valueOf(type, value.name());
}
}
A latent description of an enumeration value.
/**
* A latent description of an enumeration value.
*/
class Latent extends AbstractBase {
The type of the enumeration.
/**
* The type of the enumeration.
*/
private final TypeDescription enumerationType;
The value of the enumeration.
/**
* The value of the enumeration.
*/
private final String value;
Creates a latent description of an enumeration value.
Params: - enumerationType – The enumeration type.
- value – The value of the enumeration.
/**
* Creates a latent description of an enumeration value.
*
* @param enumerationType The enumeration type.
* @param value The value of the enumeration.
*/
public Latent(TypeDescription enumerationType, String value) {
this.enumerationType = enumerationType;
this.value = value;
}
{@inheritDoc}
/**
* {@inheritDoc}
*/
public String getValue() {
return value;
}
{@inheritDoc}
/**
* {@inheritDoc}
*/
public TypeDescription getEnumerationType() {
return enumerationType;
}
{@inheritDoc}
/**
* {@inheritDoc}
*/
public <T extends Enum<T>> T load(Class<T> type) {
if (!enumerationType.represents(type)) {
throw new IllegalArgumentException(type + " does not represent " + enumerationType);
}
return Enum.valueOf(type, value);
}
}
}