0

有没有什么办法在编译时创建Map或Set类型的数据结构?静态数据结构

我问这个问题的原因是因为我正在使用App Engine,并且我有一些需要排序和搜索的数据结构,但它们是不变的,所以我想避免创建的时间成本他们在创业时。

+0

我不确定这是可能的 - 在应用程序运行之前如何创建对象?如果数据是预先计算并存储在一个平面文件(或其他序列化格式)中,则可以在启动时加载它,但我认为编译器不能为您创建*数据结构对象... – FrustratedWithFormsDesigner 2010-11-02 15:33:16

+0

There可能没有任何可用的工具来做到这一点,但它可能。例如,它可能在编译时创建一个数组。如果它被排序,则伴侣功能可以将它作为一个集合使用。 – 2010-11-02 15:37:14

+0

@DutrowLLC:你能展示一个在编译时创建数组的例子吗? – FrustratedWithFormsDesigner 2010-11-02 15:57:52

回答

3

与任何性能优化一样,首先要问自己的是在运行时设置这些结构所花的时间是否真的影响性能。你的结构有多大面积?他们需要多长时间才能成立?如果你还没有测量这个,你正在从事不成熟的优化,正如我们所知,这是所有邪恶的根源。

假设你已经完成了这个任务,那么让我们来看看这些选项。你真的可以节省多少时间?你最好的选择是使用某种形式的系列化,但你必须自己写;即使您定义了一种文件格式来容纳内容,文件也将不得不被解析,并且必须创建内存中的数据结构。这需要时间,而且创建地图或集合并填充它们不太可能快得多。在某些语言中,理论上可以为这些结构保存内存的位模式,但即使您可以这样做,您也会使自己容易受到编译器版本的任何微小变化的影响,并且您所做的任何错误都几乎无法调试。

总之,除非您确定需要,否则不要这样做。即使那样,你可能不应该这样做。你应该唯一的一次是如果(可能非常小)节省时间绝对意味着你的项目成功与失败之间的差异。

+0

是的,我并没有试图让自己的生活变得异常艰难,但我不知道你是否可以在类中做这样的事情(而不是static {//做些事情)):compiletime {// do stuff} ; ...现在这很容易... – 2010-11-02 22:27:50

+0

这是一个合理的问题,但答案是:这几乎是不可能的。 – DJClayworth 2010-11-03 13:55:42

2

如果您使用的是Spring,您可以在配置中创建并填充这些数据结构并对其进行缓存,但我没有看到如何避免在运行时创建和填充这些数据结构。您必须在某个时间运行该代码。听起来像对我来说过早成熟的优化。

1

在编译时我不认为它是可能的。在运行时它是可能的。你最好的解决办法是使用App Engine,也许使用cron作业技巧,以保持它的热cron job link

然后你就可以在代码的静态块,将缓存应用

的第一次运行定义列表例如

private static List<Object> list = new ArrayList<Object>(); 

static { 
    for(Value value : getValues()){ 
     list.add(value); 
    } 
} 

另见spring annotations为岗位结构,因此您可以通过注释与@PostConstruct的方法是创建你的对象时,将被执行做相同的,但在非静态环境。

1

否;所有对象的创建总是在运行时发生。

话虽这么说,你可以声明和初始化一起设置是这样的:

private static Set<String> set = new HashSet<String>(Arrays.asList("abc", "def")); 

这仍然会在运行时虽然执行。

要处理地图,您必须改用静态初始化程序。