Java .properties
文件中存在重复键时定义的行为是什么?
thing.valueA = 1
thing.valueB = 2
thing.valueA = 99
保证thing.valueA
使用哪个值? 1,99还是未定义?这种行为是否记录在任何地方?
NB。我不是问重复的密钥是否被认为是最佳实践。
答案 0 :(得分:7)
根据我对Properties
的理解,load方法的工作方式与此类似:
put()
方法这意味着您的示例会显示99
。
加载方法的设计基本上就像你坐下来打字一样
propInstance.put("Key", "Value");
propInstance.put("Other", "Thing");
etc etc
要了解此行为,请参阅Hashtable.put()
的文档,该文档指定它使用新值更新任何重复项。由于Hashtable是Properties的超类,因此Properties也会复制此行为。
答案 1 :(得分:5)
因为这没有在类的规范中定义,我会说这个问题最正确的答案是结果是未定义的,并且可能因实现而异。
但是,因为java.util.Properties继承自java.utils.Hashtable,所以最有可能的实现与@jozefg完全相同,您可以在OpenJDK源中看到Sun实现以这种方式工作({{3截至撰写本文时)。读取每一行,解析它以决定是否需要追加其他行,单独的键和值,将键/值放在Hashtable中。
没有:
这一切都非常简单,并且基本上假定您没有使用重复的密钥,或者如果您有,那么您的问题就是整理出来。
现在,当然,要完全确定您要查看所有可能的JVM或至少是您的代码的目标JVM,以确保实现没有区别,但我认为这个实现是最可能是一个。
答案 2 :(得分:2)
这对我有用。我没有使用Properties,而是实例化了NaehasProperties,并覆盖了HashTable put()。
/**
* Purpose: Properties doesn't detect duplicate keys. So this exists.
* @author shaned
*/
package com.naehas.tests.configs;
import java.util.Properties;
import org.apache.log4j.Logger;
public class NaehasProperties extends Properties
{
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(NaehasProperties.class);
public NaehasProperties()
{
super();
}
/**
* @param defaults
*/
public NaehasProperties(Properties defaults)
{
super(defaults);
}
/**
* Overriding the HastTable put() so we can check for duplicates
*
*/
public synchronized Object put(Object key, Object value)
{
// Have we seen this key before?
//
if (get(key) != null)
{
StringBuffer message = new StringBuffer("Duplicate key found: " + key + " with value: " + value);
message.append(". Original value is: " + (String) get(key));
log.error(message.toString());
// Setting key to null will generate an exception and cause an exit.
// Can not change the signature by adding a throws as it's not compatible
// with HashTables put().
//
key = null;
}
return super.put(key, value);
}
}
答案 3 :(得分:0)
它通常需要最后一个值,在你的情况下它将是99。
谢谢, 拉加