我试图在Java中设计一个通用的Key类来表示主要的pojo键。
值可以是各种类型,即BigInteger,String,Uuid's。我正在寻找实现此类的最佳选择。我当前的实现看起来像这样。
谁能帮助我提供更准确的实施方案,或者确定当前实施方案存在的问题?我尚未实现equals方法。欢迎任何指针。
此类必须与GWT兼容。
@SuppressWarnings("serial")
@GwtCompatible
public class Key<T extends Serializable> implements Serializable {
public enum KeyType {
BigInt, Uuid, String ;
}
private final T keyValue ;
private final KeyType keyType ;
Key() {
keyValue = null;
keyType = null;
}
public Key(T value){
this.keyValue = value ;
this.keyType = determineKeyType(value);
}
/**
* @return
*/
private KeyType determineKeyType(Object value) {
if ( isValueUuid(value))
return KeyType.Uuid ;
else if (value instanceof BigInteger)
return KeyType.BigInt ;
else
return KeyType.String;
}
/**
* @param value
* @return
*/
private boolean isValueUuid(Object value) {
// TODO Auto-generated method stub
return false;
}
public Key(T val, KeyType tp){
this.keyValue = val ;
this.keyType = tp;
}
public KeyType getKeyType(){
return keyType ;
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
public T getKeyValue(){
return this.keyValue ;
}
}
最佳答案
在我看来,您将从这里的Factory pattern中受益。
您将有一个接口Key
,一个AbstractKey
,以及所需的该AbstractKey
的尽可能多的实现(在示例示例中,应为3)。 KeyFactory将负责创建密钥。
实际上,它将给出:
public interface Key<T> extends Serializable {
T getKeyValue();
}
public abstract class AbstractKey<T> implements Key<T> {
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj instanceof AbstractKey) {
return getKeyValue().equals(((AbstractKey) obj).getKeyValue());
}
return false;
}
}
public class StringKey extends AbstractKey<String> {
private String keyValue;
StringKey() {
super();
}
protected StringKey(String val) {
super(val);
this.keyValue = val;
}
@Override
public String getKeyValue() {
return keyValue;
}
}
public class BigIntKey extends AbstractKey<BigInteger> {
private BigInteger keyValue;
BigIntKey() {
super();
}
protected BigIntKey(BigInteger val) {
super(val);
this.keyValue = val;
}
@Override
public BigInteger getKeyValue() {
return keyValue;
}
}
...
public class KeyFactory {
public static Key<String> getKey(String obj) {
return new StringKey(obj);
}
public static Key<BigInteger> getKey(BigInteger obj) {
return new BigIntKey(obj);
}
}
该解决方案的优点(即使比您已经拥有的解决方案更冗长)是,您可以将
Key
的类型限制为实际需要的类型。另外,对于可见性有限的构造函数(足以使GWT正确编译),可以强制代码使用KeyFactory
。