有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java对HashMap/Array的静态访问?

下面是一个在web应用程序中使用的静态方法的示例。如您所见,每次调用此方法时,字符串[]都会变得异常。它是线程安全的,因为它是在一个静态方法中,但这是一个昂贵的调用

还有哪些其他方法可以使用Allenosarr[],使其在每次调用该方法时都不会被实例化

我正在考虑以下选择

  • 具有初始化静态最终字符串[]的静态构造函数
  • 使用单例(尽管这会阻碍很多人)

这将是一个常量数组,在实例化服务器的生存期内不会更改

public class UserHealthConcernsManager {
    public static String[] getAllergensFlag () {

        String[] allergensArr = new String[12];

        allergensArr[0] = "x";
        allergensArr[1] = "y";
        allergensArr[2] = "w";
                 _SNIP_
                return allergensArr;
     }
}

共 (5) 个答案

  1. # 1 楼答案

    静态构造函数似乎是显而易见的解决方案

    static String[] allergensArr = {"x", "y", "w", ...9 more...}
    

    您确实需要确保在应用程序的生命周期内没有人重新分配静态字段或修改数组

    更新:如果你真的关心确保没有客户篡改它,你可以做:

    final static List<String> x = Collections.unmodifiableList(Arrays.asList("x", "y", "z", ...));
    
  2. # 2 楼答案

    您是否考虑过使用List而不是引用数组

    代码可以简化为:

    public static final List<String> allergensFlag =
        Collections.unmodifiableList(Arrays.asList(
            "x",
            "y",
            "w",
            ...
        ));
    

    如果你真的想要老式的阵列,那么克隆的成本是非常小的

    private static final String[] allergensFlag = {
        "x",
        "y",
        "w",
        ...
    };
    
    public static String[] getAllergensFlag () {
        return allergensFlag.clone();
    }
    
  3. # 3 楼答案

    有时,定义的问题范围可能太窄,无法进行良好的优化

    如果您的问题是需要将这些项从传入的哈希映射移动到数组中,那么效率不会太高(尽管您可能希望从这样的数组开始:新字符串[]{“ADDED_SUGARS_FREE_FLAG”,“EGG_FREE_FLAG”,…}并对其进行迭代,这样就不会有所有重复的行

    因此,为了获得更好的优化,您可能需要缩小一两个级别。为什么要将它们存储在一个数组中,难道不能复制用户hashmap的一部分或全部吗?用户hashmap是否可以设置为不可变的,这样您就可以创建它的指针副本,甚至不必费心提取值

    或者更好的是,您可以用一个更智能的集合包装HashMapSupport,以解决使用它的所有类的问题

    如果我对你的代码不太了解的话,我真的无法回答这些问题,但这正是我要看的东西

    编辑后: 你已经稍微改变了这个问题。您现在拥有的相当于:

    return new String[]{"w", "x", "y", ...}
    

    你确定你没有简化问题的一部分吗

  4. # 4 楼答案

    1. 静态并不意味着线程安全。如果“用户”(HashMapSupport)跨多个线程共享
    2. 看起来并不贵
    3. 如果确实需要,可以将此类信息存储在会话对象中
    4. 如果需要保证不能修改字符串数组,那么需要将字符串数组包装到其他对象中,以保证存储的对象是不可变的(例如,仅getter方法)

    编辑:是的。正如其他人所指出的,您已经大大改变了问题。如果要保证数组是不可变的,请参见第4点