java中的通用枚举参数。这可能吗?

发布于 2024-09-24 11:38:23 字数 1973 浏览 2 评论 0原文

我正在尝试编写一个通用函数,它将接受任何枚举,并将值放入映射中以在下拉列表中使用。

这是我到目前为止所拥有的(对于特定枚举),我的函数 enumToMap 通常可以重写以接受任何枚举类型吗?

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

    private enum testenum{
        RED,BLUE,GREEN
    }


    private static Map enumToMap(testenum e){
        HashMap result = new HashMap();
        List<testenum> orderReceiptKeys = Arrays.asList(e.values());
        List<String> orderReceiptValues = unCapsCase(orderReceiptKeys);
        for(int i=0;i<orderReceiptKeys.size();i++){
            result.put(orderReceiptKeys.get(i), orderReceiptValues.get(i));
        }
        return result;
    }

     /**
     * Converts a string in the form of 'TEST_CASE' to 'Test case'
     * @param s
     * @return
     */
    private static String unCapsCase(String s){
        StringBuilder builder = new StringBuilder();
        boolean first=true;
        for(char c:s.toCharArray()){
            if(!first)
                c=Character.toLowerCase(c);
            if(c=='_')
                c=' ';
            builder.append(c);
            first=false;
        }
        return builder.toString();
    }


    /**
     * Converts a list of strings in the form of 'TEST_CASE' to 'Test case'
     * @param l
     * @return
     */
    private static List<String> unCapsCase(List l){
        List<String> list = new ArrayList();

        for(Object o:l){
            list.add(unCapsCase(o.toString()));
        }

        return list;
    }


    public static void main(String[] args) throws Exception {

        try{
            testenum e=testenum.BLUE;
            Map map = enumToMap(e);
            for(Object k:map.keySet()){
                System.out.println(k.toString()+"=>"+map.get(k));
            }
        }catch(Exception e){
            e.printStackTrace();
        }


    }

}

感谢您的任何建议。

I am trying to write a generic function that will accept any enum, and put the values into a map for use in a drop down.

This is what I have so far, (for a specific enum), can my function enumToMap be rewritten generally to accept any enum type?

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

    private enum testenum{
        RED,BLUE,GREEN
    }


    private static Map enumToMap(testenum e){
        HashMap result = new HashMap();
        List<testenum> orderReceiptKeys = Arrays.asList(e.values());
        List<String> orderReceiptValues = unCapsCase(orderReceiptKeys);
        for(int i=0;i<orderReceiptKeys.size();i++){
            result.put(orderReceiptKeys.get(i), orderReceiptValues.get(i));
        }
        return result;
    }

     /**
     * Converts a string in the form of 'TEST_CASE' to 'Test case'
     * @param s
     * @return
     */
    private static String unCapsCase(String s){
        StringBuilder builder = new StringBuilder();
        boolean first=true;
        for(char c:s.toCharArray()){
            if(!first)
                c=Character.toLowerCase(c);
            if(c=='_')
                c=' ';
            builder.append(c);
            first=false;
        }
        return builder.toString();
    }


    /**
     * Converts a list of strings in the form of 'TEST_CASE' to 'Test case'
     * @param l
     * @return
     */
    private static List<String> unCapsCase(List l){
        List<String> list = new ArrayList();

        for(Object o:l){
            list.add(unCapsCase(o.toString()));
        }

        return list;
    }


    public static void main(String[] args) throws Exception {

        try{
            testenum e=testenum.BLUE;
            Map map = enumToMap(e);
            for(Object k:map.keySet()){
                System.out.println(k.toString()+"=>"+map.get(k));
            }
        }catch(Exception e){
            e.printStackTrace();
        }


    }

}

Thanks for any suggestions.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

世俗缘 2024-10-01 11:38:23

enumToMap 方法的签名更改为如下所示:

private static <E extends Enum<E>> Map<E, String> enumToMap(Class<E> enumType)

然后在调用 e.values() 的地方使用 enumType.getEnumConstants() 代替。

在您的 main 方法中,您可以像这样调用此方法:

Map<testenum, String> map = enumToMap(testenum.class);

正如 Seanizer 提到的,您还应该使用 EnumMap 作为 Map 实现,而不是 HashMap

Change the signature of your enumToMap method to something like this:

private static <E extends Enum<E>> Map<E, String> enumToMap(Class<E> enumType)

Then where you call e.values() use enumType.getEnumConstants() instead.

In your main method you can then call this method like:

Map<testenum, String> map = enumToMap(testenum.class);

As seanizer mentions, you should also be using EnumMap as the Map implementation rather than HashMap.

芯好空 2024-10-01 11:38:23

不要将 HashMap 与枚举一起使用,这就是 EnumMap 的设计目的是。

正如 Sun 中Collection Trail 的地图部分中所写Java教程:

EnumMap,它是内部的
实现为数组,是
高性能 Map 实现
与枚举键一起使用。这
实施结合了丰富性
以及 Map 接口的安全性
速度接近阵列的速度。如果
你想将枚举映射到一个值,
你应该总是使用 EnumMap
对数组的偏好。

Don't use a HashMap with enums, this is what an EnumMap was designed for.

As written in the Map section of the Collection Trail in the Sun Java Tutorial:

EnumMap, which is internally
implemented as an array, is a
high-performance Map implementation
for use with enum keys. This
implementation combines the richness
and safety of the Map interface with a
speed approaching that of an array. If
you want to map an enum to a value,
you should always use an EnumMap in
preference to an array.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文