001/*****************************************************************************
002 * Copyright (C) PicoContainer Committers. All rights reserved.            *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD      *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file.                                                     *
007 *                                                                           *
008 * Original code by Joerg Schaibe                                            *
009 *****************************************************************************/
010package org.picocontainer;
011
012import java.io.Serializable;
013import java.lang.annotation.Annotation;
014
015/** @author Paul Hammant */
016@SuppressWarnings("serial")
017public class BindKey<T> implements Serializable {
018
019        
020        private final Class<T> type;
021    private final Class<? extends Annotation> annotation;
022
023    public BindKey(Class<T> type, Class<? extends Annotation> annotation) {
024        this.type = type;
025        this.annotation = annotation;
026    }
027
028    public Class<T> getType() {
029        return type;
030    }
031
032    public Class<? extends Annotation> getAnnotation() {
033        return annotation;
034    }
035
036    public String toString() {
037        return type.getName() + ":" + annotation.getName();
038    }
039
040    public boolean equals(Object o) {
041        if (this == o) return true;
042        if (o == null || getClass() != o.getClass()) return false;
043
044        BindKey<?> bindKey = (BindKey<?>)o;
045
046        if (!annotation.equals(bindKey.annotation)) return false;
047        if (!type.equals(bindKey.type)) return false;
048
049        return true;
050    }
051
052    public int hashCode() {
053        int result;
054        result = type.hashCode();
055        result = 31 * result + annotation.hashCode();
056        return result;
057    }
058
059    public static <T> BindKey<T> bindKey(Class<T> type, Class<? extends Annotation> annotation) {
060        return new BindKey<T>(type, annotation);
061    }
062
063}