org.weakref.jmx.internal.guava.base.Enums Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jmxutils Show documentation
Show all versions of jmxutils Show documentation
Exporting JMX mbeans made easy
/*
* Copyright (C) 2011 The Guava Authors
*
* 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 org.weakref.jmx.internal.guava.base;
import static org.weakref.jmx.internal.guava.base.Preconditions.checkNotNull;
import org.weakref.jmx.internal.guava.annotations.Beta;
import org.weakref.jmx.internal.guava.annotations.GwtCompatible;
import org.weakref.jmx.internal.guava.annotations.GwtIncompatible;
import java.io.Serializable;
import java.lang.reflect.Field;
import javax.annotation.Nullable;
/**
* Utility methods for working with {@link Enum} instances.
*
* @author Steve McKay
*
* @since 9.0
*/
@GwtCompatible(emulated = true)
@Beta
public final class Enums {
private Enums() {}
/**
* Returns the {@link Field} in which {@code enumValue} is defined. For example, to get the
* {@code Description} annotation on the {@code GOLF} constant of enum {@code Sport}, use
* {@code Enums.getField(Sport.GOLF).getAnnotation(Description.class)}.
*
* @since 12.0
*/
@GwtIncompatible("reflection")
public static Field getField(Enum> enumValue) {
Class> clazz = enumValue.getDeclaringClass();
try {
return clazz.getDeclaredField(enumValue.name());
} catch (NoSuchFieldException impossible) {
throw new AssertionError(impossible);
}
}
/**
* Returns a {@link Function} that maps an {@link Enum} name to the associated {@code Enum}
* constant. The {@code Function} will return {@code null} if the {@code Enum} constant
* does not exist.
*
* @param enumClass the {@link Class} of the {@code Enum} declaring the constant values
* @deprecated Use {@link Enums#stringConverter} instead. Note that the string converter has
* slightly different behavior: it throws {@link IllegalArgumentException} if the enum
* constant does not exist rather than returning {@code null}. It also converts {@code null}
* to {@code null} rather than throwing {@link NullPointerException}. This method is
* scheduled for removal in Guava 18.0.
*/
@Deprecated
public static > Function valueOfFunction(Class enumClass) {
return new ValueOfFunction(enumClass);
}
/**
* A {@link Function} that maps an {@link Enum} name to the associated constant, or {@code null}
* if the constant does not exist.
*/
private static final class ValueOfFunction>
implements Function, Serializable {
private final Class enumClass;
private ValueOfFunction(Class enumClass) {
this.enumClass = checkNotNull(enumClass);
}
@Override
public T apply(String value) {
try {
return Enum.valueOf(enumClass, value);
} catch (IllegalArgumentException e) {
return null;
}
}
@Override public boolean equals(@Nullable Object obj) {
return obj instanceof ValueOfFunction && enumClass.equals(((ValueOfFunction) obj).enumClass);
}
@Override public int hashCode() {
return enumClass.hashCode();
}
@Override public String toString() {
return "Enums.valueOf(" + enumClass + ")";
}
private static final long serialVersionUID = 0;
}
/**
* Returns an optional enum constant for the given type, using {@link Enum#valueOf}. If the
* constant does not exist, {@link Optional#absent} is returned. A common use case is for parsing
* user input or falling back to a default enum constant. For example,
* {@code Enums.getIfPresent(Country.class, countryInput).or(Country.DEFAULT);}
*
* @since 12.0
*/
public static > Optional getIfPresent(Class enumClass, String value) {
checkNotNull(enumClass);
checkNotNull(value);
try {
return Optional.of(Enum.valueOf(enumClass, value));
} catch (IllegalArgumentException iae) {
return Optional.absent();
}
}
/**
* Returns a converter that converts between strings and {@code enum} values of type
* {@code enumClass} using {@link Enum#valueOf(Class, String)} and {@link Enum#name()}. The
* converter will throw an {@code IllegalArgumentException} if the argument is not the name of
* any enum constant in the specified enum.
*
* @since 16.0
*/
public static > Converter stringConverter(final Class enumClass) {
return new StringConverter(enumClass);
}
private static final class StringConverter>
extends Converter implements Serializable {
private final Class enumClass;
StringConverter(Class enumClass) {
this.enumClass = checkNotNull(enumClass);
}
@Override
protected T doForward(String value) {
return Enum.valueOf(enumClass, value);
}
@Override
protected String doBackward(T enumValue) {
return enumValue.name();
}
@Override
public boolean equals(@Nullable Object object) {
if (object instanceof StringConverter) {
StringConverter> that = (StringConverter>) object;
return this.enumClass.equals(that.enumClass);
}
return false;
}
@Override
public int hashCode() {
return enumClass.hashCode();
}
@Override
public String toString() {
return "Enums.stringConverter(" + enumClass.getName() + ".class)";
}
private static final long serialVersionUID = 0L;
}
}