On Mar 8, 2009, at 5:34 PM, David Blevins wrote:

Technically speaking the java.util.Properties class will do this already (which I only discovered a few months ago), but you have to pass the parent Properties instance in the constructor of the child properties object which we aren't doing just yet. We could definitely do this for the properties in the system instance that default to the system properties.

On second thought it doesn't look like such a good idea to rely on the java.util.Properties object inheritance. The Properties specific methods do the parent delegation nicely, but all java.util.Map methods (size, get, set, keySet, entrySet, values) do not reflect the parent's data. Seems very error prone.

Here's a little test case:

    public void testPropertiesInheritance() {
        Properties system = new Properties();
        system.setProperty("color", "red");
        system.setProperty("shape", "round");
        system.setProperty("texture", "matte");

        Properties systemInstance = new Properties(system);
        systemInstance.setProperty("color", "orange");
        systemInstance.setProperty("weight", "15");
        systemInstance.setProperty("height", "2");

        // The good parts
assertEquals("SystemInstance.getProperty(\"shape\")", "round", systemInstance.getProperty("shape")); assertEquals("SystemInstance.getProperty(\"texture\")", "matte", systemInstance.getProperty("texture")); assertEquals("SystemInstance.getProperty(\"color\")", "orange", systemInstance.getProperty("color")); assertEquals("SystemInstance.getProperty(\"weight\")", "15", systemInstance.getProperty("weight")); assertEquals("SystemInstance.getProperty(\"height\")", "2", systemInstance.getProperty("height"));

ArrayList<?> names = Collections.list(systemInstance.propertyNames());
        assertEquals("Names.size()", 5, names.size());

        // update "system" and check "systemInstance"
        system.setProperty("shape", "square");
assertEquals("SystemInstance.getProperty(\"shape\")", "square", systemInstance.getProperty("shape"));

// The bad, all java.util.Map methods do not reflect this inheritance assertEquals("SystemInstance.size()", 3, systemInstance.size()); assertEquals("SystemInstance.get(\"shape\")", null, systemInstance.get("shape")); assertEquals("SystemInstance.get(\"texture\")", null, systemInstance.get("texture")); assertEquals("SystemInstance.get(\"color\")", "orange", systemInstance.get("color")); assertEquals("SystemInstance.get(\"weight\")", "15", systemInstance.get("weight")); assertEquals("SystemInstance.get(\"height\")", "2", systemInstance.get("height"));
    }


-David

Reply via email to