The previous sample code I posted was foolish, I'm sorry!!!

Find attached a better version that uses a single Object reference to track both initialization and modify state.

During initialization this Object references a byte[] where each element tracks the init state of the corresponding attribute.

Init ends when all attributes has been set at least once or when the client code calls a provided method.

After init has ended the byte[] is discarded and the Object references the static instance of Boolean.FALSE (so there's no memory wasted beyound the single Object reference itself).

After at least one attributes is set, the Object references the static instance Boolean.TRUE.

Client code can decide to force init end with a non-modified state or even an already-modified state, if it likes to.

The code does not check if the new value set for an attribute is equal or not to the value already present. This is because a == check would not be good because two different Integer instances both containing the same value are to be considered equal. So the equals() method should be used, but that is not garanteed to work with all class types, so I think it may be better to skip the check altogether and consider an attribute modified in any case.

Hope this is helpful!!! :-)

Bye
Paolo


public class BasicFeature {
        private Object[] attributes;
        private Object mods;

        public void forceInitEnded(boolean modified) {
             //force init end and specified modify state
           mods = modified ? Boolean.TRUE : Boolean.FALSE;
        }

        public boolean isInitEnded() {
           if( mods instanceof Boolean )     //init ended
             return true;

           if( mods == null ) {                                 //if still null
             mods = new byte[attributes.length];    //create it
             Arrays.fill((byte[])mods,(byte)0);          //fill with zeros
             
             return false;   //init not even started
           }

           for(int i=0;i<((byte[])mods).length;i++)
             if( ((byte[])mods)[i] == 0 )  //if any attribute never flagged
               return false;          //init not ended

           forceInitEnded(false);         //init ended, no mods done

           return true;     //init ended
        }

        public void setAttribute(Object[] newAttributes) {
           //call setAttribute() for each element
        }

        public void setAttribute(int attributeIndex, Object newAttribute) {
           if( isInitEnded() )                  //if init ended
             mods = Boolean.TRUE;               //feature modified
           else                                                                 
                                                                        //if 
init not ended 
             ((byte[])mods)[attributeIndex] = 1;   //flag the attributes mod

           attributes[attributeIndex] = newAttribute;
        }

        public boolean isModified() {
           return isInitEnded() ? ((Boolean)mods).booleanValue() : false;
        }       
}
------------------------------------------------------------------------------
Register Now & Save for Velocity, the Web Performance & Operations 
Conference from O'Reilly Media. Velocity features a full day of 
expert-led, hands-on workshops and two days of sessions from industry 
leaders in dedicated Performance & Operations tracks. Use code vel09scf 
and Save an extra 15% before 5/3. http://p.sf.net/sfu/velocityconf
_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to