diff --git a/src/java/org/apache/commons/lang/mutable/MutableObject.java b/src/java/org/apache/commons/lang/mutable/MutableObject.java
new file mode 100644
index 000000000..e499322b5
--- /dev/null
+++ b/src/java/org/apache/commons/lang/mutable/MutableObject.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang.mutable;
+
+import java.io.Serializable;
+
+/**
+ * A mutable Object
.
+ *
+ * @since 2.1
+ * @version $Id: MutableObject.java,v 1.1 2004/07/08 00:02:35 scolebourne Exp $
+ */
+public class MutableObject
+ implements Mutable, Serializable {
+
+ /** Serialization lock. */
+ private static final long serialVersionUID = 86241875189L;
+
+ /** The mutable value. */
+ private Object value;
+
+ /**
+ * Constructs a new MutableObject with the default value of null.
+ */
+ public MutableObject() {
+ super();
+ }
+
+ /**
+ * Constructs a new MutableObject with the specified value.
+ *
+ * @param value a value.
+ */
+ public MutableObject(Object value) {
+ super();
+ this.value = value;
+ }
+
+ //-----------------------------------------------------------------------
+ /**
+ * Gets the value.
+ *
+ * @return the value
+ */
+ public Object getValue() {
+ return this.value;
+ }
+
+ /**
+ * Sets the value.
+ *
+ * @param value the value to set
+ */
+ public void setValue(Object value) {
+ this.value = value;;
+ }
+
+ //-----------------------------------------------------------------------
+ /**
+ * Checks if this object equals the specified object.
+ *
+ * The object must be a MutableObject with an equal value to be equal. + * + * @param obj the object to compare to + * @return true if equal + */ + public boolean equals(Object obj) { + if (obj instanceof MutableObject) { + Object other = ((MutableObject) obj).value; + return (value == other || (value != null && value.equals(other))); + } + return false; + } + + /** + * Returns a suitable hashcode for this mutable. + * + * @return a suitable hashcode + */ + public int hashCode() { + return (value == null ? 0 : value.hashCode()); + } + + /** + * Returns the String value of this mutable. + * + * @return the mutable value as a string + */ + public String toString() { + return (value == null ? "null" : value.toString()); + } + +} diff --git a/src/test/org/apache/commons/lang/mutable/MutableObjectTest.java b/src/test/org/apache/commons/lang/mutable/MutableObjectTest.java new file mode 100644 index 000000000..bf0033d5b --- /dev/null +++ b/src/test/org/apache/commons/lang/mutable/MutableObjectTest.java @@ -0,0 +1,104 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.lang.mutable; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; +import junit.textui.TestRunner; + +/** + * JUnit tests. + * + * @version $Id: MutableObjectTest.java,v 1.1 2004/07/08 00:02:35 scolebourne Exp $ + * @see MutableShort + */ +public class MutableObjectTest extends TestCase { + + public MutableObjectTest(String testName) { + super(testName); + } + + public static void main(String[] args) { + TestRunner.run(suite()); + } + + public static Test suite() { + return new TestSuite(MutableObjectTest.class); + } + + // ---------------------------------------------------------------- + public void testConstructors() { + assertEquals(null, new MutableObject().getValue()); + + Integer i = new Integer(6); + assertSame(i, new MutableObject(i).getValue()); + assertSame("HI", new MutableObject("HI").getValue()); + assertSame(null, new MutableObject(null).getValue()); + } + + public void testGetSet() { + final MutableObject mutNum = new MutableObject(); + assertEquals(null, new MutableObject().getValue()); + + mutNum.setValue("HELLO"); + assertSame("HELLO", mutNum.getValue()); + + mutNum.setValue(null); + assertSame(null, mutNum.getValue()); + } + + public void testEquals() { + final MutableObject mutNumA = new MutableObject("ALPHA"); + final MutableObject mutNumB = new MutableObject("ALPHA"); + final MutableObject mutNumC = new MutableObject("BETA"); + final MutableObject mutNumD = new MutableObject(null); + + assertEquals(true, mutNumA.equals(mutNumA)); + assertEquals(true, mutNumA.equals(mutNumB)); + assertEquals(true, mutNumB.equals(mutNumA)); + assertEquals(true, mutNumB.equals(mutNumB)); + assertEquals(false, mutNumA.equals(mutNumC)); + assertEquals(false, mutNumB.equals(mutNumC)); + assertEquals(true, mutNumC.equals(mutNumC)); + assertEquals(false, mutNumA.equals(mutNumD)); + assertEquals(true, mutNumD.equals(mutNumD)); + + assertEquals(false, mutNumA.equals(null)); + assertEquals(false, mutNumA.equals(new Object())); + assertEquals(false, mutNumA.equals("0")); + } + + public void testHashCode() { + final MutableObject mutNumA = new MutableObject("ALPHA"); + final MutableObject mutNumB = new MutableObject("ALPHA"); + final MutableObject mutNumC = new MutableObject("BETA"); + final MutableObject mutNumD = new MutableObject(null); + + assertEquals(true, mutNumA.hashCode() == mutNumA.hashCode()); + assertEquals(true, mutNumA.hashCode() == mutNumB.hashCode()); + assertEquals(false, mutNumA.hashCode() == mutNumC.hashCode()); + assertEquals(false, mutNumA.hashCode() == mutNumD.hashCode()); + assertEquals(true, mutNumA.hashCode() == "ALPHA".hashCode()); + assertEquals(0, mutNumD.hashCode()); + } + + public void testToString() { + assertEquals("HI", new MutableObject("HI").toString()); + assertEquals("10.0", new MutableObject(new Double(10)).toString()); + } + +} diff --git a/src/test/org/apache/commons/lang/mutable/MutableTestSuite.java b/src/test/org/apache/commons/lang/mutable/MutableTestSuite.java index 3eedb137a..c8e53f034 100755 --- a/src/test/org/apache/commons/lang/mutable/MutableTestSuite.java +++ b/src/test/org/apache/commons/lang/mutable/MutableTestSuite.java @@ -22,7 +22,7 @@ import junit.textui.TestRunner; /** * JUnit tests. * - * @version $Id: MutableTestSuite.java,v 1.3 2004/07/07 23:50:28 scolebourne Exp $ + * @version $Id: MutableTestSuite.java,v 1.4 2004/07/08 00:02:35 scolebourne Exp $ */ public class MutableTestSuite { @@ -39,6 +39,7 @@ public class MutableTestSuite { suite.addTest(MutableLongTest.suite()); suite.addTest(MutableFloatTest.suite()); suite.addTest(MutableDoubleTest.suite()); + suite.addTest(MutableObjectTest.suite()); return suite; }