zoukankan      html  css  js  c++  java
  • Guava Enums

    概述

    Enums提供了几个操作Enum的便利方法

    常用方法

    Field getField(Enum<?> enumValue): 返回变量名为enumValue变量值的Field

    <T extends Enum<T>> Function<String, T> valueOfFunction(Class<T> enumClass): 返回一个可以将enum名字字符串转换成指定类型的enum的, 如果enum不存在时,Function将返回null

    Optional<T> getIfPresent(Class<T> enumClass, String value): 使用Enum.valueOf()来返回指定名称和class的Enum的Optional,如果不存在则返回Absent, 常见用法Enums.getIfPresent(Country.class, countryInput).or(Country.DEFAULT)

    示例代码

            TestEnum a = TestEnum.A;
            System.out.println(Enums.getField(a));
            Function<String, TestEnum> function = Enums.valueOfFunction(TestEnum.class);
            System.out.println(function.apply("B"));
            System.out.println(Enums.getIfPresent(TestEnum.class, "D").or(TestEnum.A)); // D不存在,则返回默认的A
            System.out.println(Enums.getIfPresent(TestEnum.class, "C").or(TestEnum.A)); // C存在,直接返回

    public static final enumtest.TestEnum enumtest.TestEnum.A
    B
    A
    C

    源代码

    /*
    * 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 com.google.common.base;
    
    import static com.google.common.base.Preconditions.checkNotNull;
    
    import com.google.common.annotations.Beta;
    import com.google.common.annotations.GwtCompatible;
    import com.google.common.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)}.
         *
         * 返回变量名为enumValue变量值得Field
         *
         * @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.
         *
         * 返回一个可以将enum名字字符串转换成指定类型的enum的Function
         * 如果enum不存在时,Function将返回null
         *
         * @param enumClass the {@link Class} of the {@code Enum} declaring the
         *     constant values.
         */
        public static <T extends Enum<T>> Function<String, T> valueOfFunction(Class<T> enumClass) {
            return new ValueOfFunction<T>(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<T extends Enum<T>>
                implements Function<String, T>, Serializable {
    
            private final Class<T> enumClass;
    
            private ValueOfFunction(Class<T> enumClass) {
                this.enumClass = checkNotNull(enumClass);
            }
    
            @Override
            public T apply(String value) {
                try {
                    // 通过valueOf方法实现将value转为enum
                    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);}
         *
         * 使用Enum.valueOf()来返回指定名称和class的Enum的Optional,如果不存在则返回Absent
         *
         * @since 12.0
         */
        public static <T extends Enum<T>> Optional<T> getIfPresent(Class<T> enumClass, String value) {
            checkNotNull(enumClass);
            checkNotNull(value);
            try {
                return Optional.of(Enum.valueOf(enumClass, value));
            } catch (IllegalArgumentException iae) {
                return Optional.absent();
            }
        }
    }
  • 相关阅读:
    pikachu——Unsafe Filedownload Fileupload(不安全的文件下载和上传)
    pikachu——Files Inclusion(文件包含漏洞)
    pikachu——RCE
    pikachu——SQL注入
    pikachu——XSS(跨网站脚本漏洞)
    pikachu——CSRF
    pikachu——暴力破解
    GCD 信号量 dispatch_semaphore_t
    【转】iOS 9 Storyboard 教程(一上)
    一个大小为N的数组,里面是N个整数,怎样去除重复的数
  • 原文地址:https://www.cnblogs.com/zemliu/p/3346557.html
Copyright © 2011-2022 走看看