package edu.stanford.nlp.ling; import java.io.Serializable; /** * A <code>ValueLabel</code> object acts as a Label with linguistic * attributes. This is an abstract class, which doesn't actually store * or return anything. It returns <code>null</code> to any requests. However, * it does * stipulate that equals() and compareTo() are defined solely with respect to * value(); this should not be changed by subclasses. * Other fields of a ValueLabel subclass should be regarded * as secondary facets (it is almost impossible to override equals in * a useful way while observing the contract for equality defined for Object, * in particular, that equality must by symmetric). * This class is designed to be extended. * * @author Christopher Manning */ public abstract class ValueLabel implements Label, Comparable<ValueLabel>, Serializable { protected ValueLabel() { } /** * Return the value of the label (or null if none). * The default value returned by an <code>ValueLabel</code> is * always <code>null</code> * * @return the value for the label */ public String value() { return null; } /** * Set the value for the label (if one is stored). * * @param value - the value for the label */ public void setValue(String value) { } /** * Return a string representation of the label. This will just * be the <code>value()</code> if it is non-<code>null</code>, * and the empty string otherwise. * * @return The string representation */ @Override public String toString() { String val = value(); return (val == null) ? "" : val; } public void setFromString(String labelStr) { throw new UnsupportedOperationException(); } /** * Equality for <code>ValueLabel</code>s is defined in the first instance * as equality of their <code>String</code> <code>value()</code>. * Now rewritten to correctly enforce the contract of equals in Object. * Equality for a <code>ValueLabel</code> is determined simply by String * equality of its <code>value()</code>. Subclasses should not redefine * this to include other aspects of the <code>ValueLabel</code>, or the * contract for <code>equals()</code> is broken. * * @param obj the object against which equality is to be checked * @return true if <code>this</code> and <code>obj</code> are equal */ @Override public boolean equals(Object obj) { String val = value(); return (obj instanceof ValueLabel) && (val == null ? ((Label) obj).value() == null : val.equals(((Label) obj).value())); } /** * Return the hashCode of the String value providing there is one. * Otherwise, returns an arbitrary constant for the case of * <code>null</code>. */ @Override public int hashCode() { String val = value(); return val == null ? 3 : val.hashCode(); } /** * Orders by <code>value()</code>'s lexicographic ordering. * * @param valueLabel object to compare to * @return result (positive if this is greater than obj) */ public int compareTo(ValueLabel valueLabel) { return value().compareTo(valueLabel.value()); } /** * Returns a factory that makes Labels of the appropriate sort. * * @return the <code>LabelFactory</code> */ public abstract LabelFactory labelFactory(); private static final long serialVersionUID = -1413303679077285530L; }