代码之家  ›  专栏  ›  技术社区  ›  Shaun Mundi

静态访问hashmap/array?

  •  0
  • Shaun Mundi  · 技术社区  · 15 年前

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

    还有什么其他方法可以使用Allergensarr[],以便在每次调用该方法时不实例化它。

    我正在考虑以下选择。

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

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

    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 回复  |  直到 15 年前
        1
  •  3
  •   Tom Hawtin - tackline    15 年前

    你考虑过使用吗 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();
    }
    
        2
  •  2
  •   hythlodayr    15 年前
    1. 静态并不意味着线程安全。如果“用户”(hashmapsupport)跨多个线程共享…
    2. 它看起来不太贵。
    3. 如果您真的觉得需要的话,可以将这类信息存储在会话对象中。
    4. 如果需要确保不能修改字符串数组,则需要将字符串数组包装在其他对象中,以确保存储的对象是不可变的(例如,只有getter方法)。

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

        3
  •  1
  •   Keith Randall    15 年前

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

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

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

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

    final static List<String> x = Collections.unmodifiableList(Arrays.asList("x", "y", "z", ...));
    
        4
  •  0
  •   Bill K    15 年前

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

    如果您的问题是需要将这些项从传入的哈希映射移动到一个数组中,那么它的效率不会太高(尽管您可能希望从这样的数组开始:new string[]“added_sugars_free_flag”、“egg_free_flag”、…并对其进行迭代,这样就不会有所有重复的行。

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

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

    如果不了解更多关于代码的信息,我就无法真正回答这些问题,但这正是我要研究的内容。

    编辑后: 你已经改变了一点问题。你现在拥有的相当于:

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

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

        5
  •  0
  •   alphazero    15 年前

    只需在Web应用启动时初始化数组并将其放入servlet上下文。见 ServletContextListener ServletContext .