14

.properties当 Java文件中存在重复键时,定义的行为是什么?

thing.valueA = 1
thing.valueB = 2

thing.valueA = 99

保证使用哪个值thing.valueA?1、99 还是未定义?这种行为是否记录在任何地方?

注意。我不是在问重复键是否被认为是最佳实践。

4

4 回答 4

8

根据我对 的理解Properties,加载方法的工作方式与此类似:

  1. 将文件分成几行,
  2. 看下一行,
  3. 使用一些规则确定键值对(见这里
  4. put()以类似于方法的方式将键值对放入 Properties 实例中

这意味着您的示例将显示99.

load 方法基本上被设计成就像你坐下来打字一样工作

propInstance.put("Key", "Value");
propInstance.put("Other", "Thing");
etc etc

要了解此行为,请参阅Hashtable.put()指定它使用新值更新任何重复项的文档。由于 Hashtable 是 Properties 的超类,Properties 也复制了这种行为。

于 2012-09-24T03:22:15.423 回答
7

因为这没有在类的规范中定义,所以我想说这个问题的最正确答案是结果是未定义的,并且可能因实现而异。

但是,因为 java.util.Properties 继承自 java.utils.Hashtable,所以最有可能的实现与 @jozefg 所描述的完全一样,您可以在 OpenJDK 源代码中看到 Sun 实现以这种方式工作(Properties.java:345为在撰写本文时)。读取每一行,解析它以确定是否需要附加其他行,分离键和值,将键/值放入 Hashtable。

没有:

  • 检查密钥是否存在
  • 基于密钥的存在引发的异常
  • 避免覆盖值
  • 乱序处理

这一切都非常简单,基本上假设您没有使用重复键,或者如果您有,那么解决问题是您的问题。

现在,当然,要完全确定您想要查看所有可能的 JVM 或至少查看代码的目标 JVM,以确保实现没有差异,但我认为这个实现是最有可能的。

于 2013-03-22T12:13:03.300 回答
2

这对我有用。我没有使用属性,而是实例化了一个 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);
   }
}
于 2013-09-13T23:33:01.823 回答
0

它通常取最后一个值,在你的情况下它将是 99。

谢谢, 拉格万

于 2013-10-04T05:12:14.673 回答