硬编码值与从文件读取

时间:2013-07-25 13:18:58

标签: java data-structures

这是关于硬编码数据效率的一般性问题 - 我正在用Java编写一个程序进行一些化学分析,我需要使用不同元素的同位素丰度。我现在设置的方式是所有值(永远不需要修改)都存储在我的班级的最终字段中,即

static final double C12Abundance = .989;
static final double C12Mass = 12;

许多类似的程序将这种类型的数据存储在XML文件中,然后从那里读取值,如下所示:

<compounds>
<elements>
    <element symbol='C' mono_isotopic_mass ='12.00000000000' abundance='.989'/>

有没有任何理由(性能,记忆等)以这种方式阅读?似乎更容易将其留作现场。

8 个答案:

答案 0 :(得分:2)

硬性编码在性能和内存分配方面要快得多。

从文件中读取的内容是代码可重用性(使用不同参数运行程序而无需重新编译)。

请注意,从文件中读取内容包括以下步骤:

  1. 声明用于存储值的变量。
  2. 创建输入(流)对象
  3. 使用路径初始化
  4. 从FS
  5. 打开文件
  6. 找到要从
  7. 中读取的正确行
  8. 读取值
  9. 将其存储在
  10. 上面的变量中
  11. 关闭输入(流)
  12. 这是一个非常大的开销,而不是预编译的最终变量值为

答案 1 :(得分:2)

由于这些是真正的通用常量,属性数量有限,您可以将它们放在代码中,但组织得很好。

public enum Element {
    //  Name Mass  Abund
    C12("C", 12.0, .989),
    He4(...),
    O32(...),
    ...;

    public final String name;
    public final double monoIsotopicMass;
    public final double abundancy;

    private Element(String name, double monoIsotopicMass, double abundancy) {
        this.name = name;
        this.monoIsotopicMass = monoIsotopicMass;
        this.abundancy = abundancy;
    }
}

for (Element elem : Element.values()) {
    if (elem.abundancy > 0.5) {
        ...
    }
}

答案 2 :(得分:1)

如果您想对值进行硬编码并想要更改它们,则必须重新编译程序,这就是问题所在。从文件中读取数据有以下好处:

  • 您不必等待程序重新编译数据中的每个更改。对于一个相当大的程序,这可能需要时间。
  • 您的用户甚至无需访问来源即可更改数据。
  • 您可以使用不同的数据集,只需更改配置文件名即可切换。

也许这对你来说都不重要;然后继续将数据放入源代码。

性能本身(如在程序的性能中)从来都不是问题,除非你的探查器这样说。但是我没有看到在启动时读取数据文件的一小部分数据可能是一个很长的过程,所以我很确定你不会看到差异。

答案 3 :(得分:1)

如果你想模拟具有不同丰富度C12的宇宙,那么硬编码的值将意味着你必须重新编译程序。

可能还有其他原因:如果从外部文件中读取值,则文件用作文档,外部文件可能更容易检查错误,可能有工具生成文件或将其用于其他文件除了运行你的程序之外的其他目的......

答案 4 :(得分:0)

配置文件包含属性,通常这些属性会随时间变化。我认为,根据定义,在你的情况下,这些是固定的,永远不会改变 出于这个原因,我会做更容易的事情,将它们留作字段。

这不是性能问题,只要性能不会出现问题,这只是代码库中更容易使用的问题。

我建议你将类中的这些值作为常量提取出来,这样你就可以随时导入它来访问这些值。

答案 5 :(得分:0)

Java代码只能由Java编译器读取,而XML可由任何合理的(意思是XML感知的)语言读取。此外,如果您想添加一些值,则无需重新编译所有内容。

答案 6 :(得分:0)

就个人而言,如果价值不会被改变,并且应用程序很小,我个人会去硬编码。否则我会选择外部数据来源。

但是每当人们告诉我价值观不会改变时,这意味着他们将如此准备动态环境是一般的方法。 XML conf文件,数据库conf表等。

答案 7 :(得分:0)

如果用XML编写它们,可以为不同的设备使用不同的值, 例如,假设您有一个名称为item_margin的维度,并且它需要根据设备的宽度而有所不同,因此在values/dimens.xml中您有此

<dimen name="item_margin">0dp</dimen>

并且在最小 600dp 宽度的设备中,您希望此边距 60dp ,因此 values-sw600dp / dimens.xml你有这个

<dimen name="item_margin">60dp</dimen>

这样,这些值会根据设备宽度自动选择,因此您无需检查设备宽度并在Java代码中选择适当的值