blob: 6c1ce71658f339f2b9ba6876aac233464de6dbb1 [file] [log] [blame]
/*
* Copyright 2003-2007 the original author or authors.
*
* 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.codehaus.groovy.runtime;
import java.util.Collections;
import java.util.Iterator;
import groovy.lang.GroovyObjectSupport;
public class NullObject extends GroovyObjectSupport {
private static final NullObject INSTANCE = new NullObject();
/**
* private constructor
*/
private NullObject() {
}
/**
* get the NullObject reference
*
* @return the null object
*/
public static NullObject getNullObject() {
return INSTANCE;
}
/**
* Since this is implemented as a singleton, we should avoid the
* use of the clone method
*/
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
/**
* Tries to get a property on null, which will always fail
*
* @param property - the property to get
* @return a NPE
*/
public Object getProperty(String property) {
throw new NullPointerException("Cannot get property " + property + "() on null object");
}
/**
* Tries to set a property on null, which will always fail
*
* @param property - the proprty to set
* @param newValue - the new value of the property
*/
public void setProperty(String property, Object newValue) {
throw new NullPointerException("Cannot set property " + property + "() on null object");
}
/**
* Tries to invoke a method on null, which will always fail
*
* @param name the name of the method to invoke
* @param args - arguments to the method
* @return a NPE
*/
public Object invokeMethod(String name, Object args) {
throw new NullPointerException("Cannot invoke method " + name + "() on null object");
}
/**
* null is only equal to null
*
* @param to - the reference object with which to compare
* @return - true if this object is the same as the to argument
*/
public boolean equals(Object to) {
return to == null;
}
/**
* iterator() method to be able to iterate on null.
* Note: this part is from Invoker
*
* @return an iterator for an empty list
*/
public Iterator iterator() {
return Collections.EMPTY_LIST.iterator();
}
/**
* Allows to add a String to null.
* The result is concatenated String of the result of calling
* toString() on this object and the String in the parameter.
*
* @param s - the String to concatenate
* @return the concatenated string
*/
public Object plus(String s) {
return getMetaClass().invokeMethod(this, "toString", new Object[]{}) + s;
}
/**
* The method "is" is used to test for equal references.
* This method will return true only if the given parameter
* is null
*
* @param other - the object to test
* @return true if other is null
*/
public boolean is(Object other) {
return other == null;
}
/**
* Type conversion method for null.
*
* @param c - the class to convert to
* @return always null
*/
public Object asType(Class c) {
return null;
}
public String toString() {
return "null";
}
public int hashCode() {
throw new NullPointerException("hashCode() not allowed on null");
}
}