diff options
Diffstat (limited to 'src/tools/xcode-common/java/com/google/devtools/build/xcode/util/Value.java')
-rw-r--r-- | src/tools/xcode-common/java/com/google/devtools/build/xcode/util/Value.java | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/tools/xcode-common/java/com/google/devtools/build/xcode/util/Value.java b/src/tools/xcode-common/java/com/google/devtools/build/xcode/util/Value.java new file mode 100644 index 0000000000..6363af19a3 --- /dev/null +++ b/src/tools/xcode-common/java/com/google/devtools/build/xcode/util/Value.java @@ -0,0 +1,69 @@ +// Copyright 2014 Google Inc. All rights reserved. +// +// 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 com.google.devtools.build.xcode.util; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; + +/** + * Represents a type whose equality, hash code, and string representation are defined by a single + * immutable array. This class is designed to be extended by a final class, and to pass the member + * data to this class's constructor. + * + * @param <V> the base class that extends {@code Value} + */ +public class Value<V extends Value<V>> { + private final Object memberData; + + /** + * Constructs a new instance with the given member data. Generally, all member data should be + * reflected in final fields in the child class. + * @throws NullPointerException if any element in {@code memberData} is null + */ + public Value(Object... memberData) { + Preconditions.checkArgument(memberData.length > 0); + this.memberData = (memberData.length == 1) + ? Preconditions.checkNotNull(memberData[0]) : ImmutableList.copyOf(memberData); + } + + /** + * A type-safe alternative to calling {@code a.equals(b)}. When using {@code a.equals(b)}, + * {@code b} may accidentally be a different class from {@code a}, in which case there will be no + * compiler warning and the result will always be false. This method requires both values to have + * compatible types and to be non-null. + */ + public boolean equalsOther(V other) { + return equals(Preconditions.checkNotNull(other)); + } + + @Override + public boolean equals(Object o) { + if ((o == null) || (o.getClass() != getClass())) { + return false; + } + Value<?> other = (Value<?>) o; + return memberData.equals(other.memberData); + } + + @Override + public int hashCode() { + return memberData.hashCode(); + } + + @Override + public String toString() { + return getClass().getSimpleName() + ":" + memberData.toString(); + } +} |