001 // Copyright 2010 Waterken Inc. under the terms of the MIT X license 002 // found at http://www.opensource.org/licenses/mit-license.html 003 package org.ref_send.brand; 004 005 import java.io.Serializable; 006 007 import org.joe_e.Powerless; 008 009 /** 010 * An opaque, globally unique identifier. 011 * @param <T> purpose of this brand 012 */ 013 public class 014 Brand<T> implements Powerless, Serializable { 015 static private final long serialVersionUID = 1L; 016 017 protected Brand() {} 018 019 /** 020 * Constructs an instance. 021 * @param <T> purpose of this brand 022 */ 023 static public <T> Brand<T> 024 make() { return new Brand<T>(); } 025 026 /** 027 * Is one object {@link Object#equals equal} to another? 028 * @param <P> compared object type 029 * @param a object compared against 030 * @param b object compared to 031 * @return {@code true} if {@code a} claims {@code b} is 032 * {@link Object#equals equal}, else {@code false} 033 */ 034 static public <P> boolean 035 equal(final P a, final P b) { return null != a ? a.equals(b) : null == b; } 036 037 /** 038 * Requires that one brand is the same as another. 039 * @param <T> purpose of this brand 040 * @param expected brand compared against 041 * @param actual brand compared to 042 * @throws WrongBrand {@code actual} is not {@code expected} 043 */ 044 static public <T> void 045 require(final Brand<T> expected, final Brand<T> actual) throws WrongBrand { 046 if (!equal(expected, actual)) { throw new WrongBrand(expected,actual); } 047 } 048 }