私はこれについてかなり長い間考え、最終的に別のアプローチを思いつきました:
RemoteVariable
まず、クラスにゲッターを追加しました。
protected RemoteDeviceProxy getWrappedProxy() {
return wrappedProxy;
}
次に、後でファクトリで使用されるビルダー インターフェイスを作成しました。
public interface RemoteVariableBuilder {
public <T> RemoteVariable<T> buildNewVariable(RemoteDeviceProxy wrappedProxy);
}
次に、非汎用サブクラスを作成しましたBoolean
...
public class RemoteBooleanVariable extends RemoteVariable<Boolean> implements RemoteVariableBuilder {
public RemoteBooleanVariable(RemoteDeviceProxy wrappedProxy) {
super(wrappedProxy);
}
@SuppressWarnings("unchecked")
@Override
public <T> RemoteVariable<T> buildNewVariable(RemoteDeviceProxy wrappedProxy) {
return (RemoteVariable<T>) new RemoteBooleanVariable(wrappedProxy);
}
@Override
public Boolean get() {
return getWrappedProxy().getBoolean();
}
@Override
public void set(Boolean value) {
getWrappedProxy().setBoolean(value);
}
}
...そして整数...
public class RemoteIntegerBuilder extends RemoteVariable<Integer> implements RemoteVariableBuilder {
public RemoteIntegerBuilder(RemoteDeviceProxy wrappedProxy) {
super(wrappedProxy);
}
@SuppressWarnings("unchecked")
@Override
public <T> RemoteVariable<T> buildNewVariable(RemoteDeviceProxy wrappedProxy) {
return (RemoteVariable<T>) new RemoteIntegerBuilder(wrappedProxy);
}
@Override
public Integer get() {
return getWrappedProxy().getInteger();
}
@Override
public void set(Integer value) {
getWrappedProxy().setInteger(value);
}
}
実際、Eclipse は、基本クラスとインターフェースを認識すると、ほとんどのコードを作成しました。
最後のステップは工場を作ることでした
public class RemoteVariableFactory {
private static final Map<String, RemoteVariableBuilder> BUILDERS = new HashMap<>();
static {
BUILDERS.put(Boolean.class.getName(), new RemoteBooleanVariable(null));
BUILDERS.put(Integer.class.getName(), new RemoteIntegerBuilder(null));
// add more builders here
}
public static <T> RemoteVariable<T> getRemoteVariable(RemoteDeviceProxy wrappedProxy, Class<T> typeClass) {
RemoteVariableBuilder remoteVariableBuilder = BUILDERS.get(typeClass.getName());
if (remoteVariableBuilder == null) {
return null; // or throw an exception whichever is better in your case
}
return remoteVariableBuilder.buildNewVariable(wrappedProxy);
}
}
これで、新しい RemoteVariables を作成する準備が整いました...
RemoteVariable<Boolean> var1 = RemoteVariableFactory.getRemoteVariable(new RemoteDevice(), Boolean.class);
RemoteVariable<Integer> var2 = RemoteVariableFactory.getRemoteVariable(new RemoteDevice(), Integer.class);
これを締めくくるために、Eng.Fouad の回答と簡単に比較してみましょう。
不利益:
- 提供するすべてのデータ型に対して新しいクラスを作成する必要があります
アドバンテージ:
- ファクトリの static ブロックに 1 行追加するだけで済み、RemoteVariable の getter と setter に 2 つの新しい if ブロックを追加する必要はありません。
- get と set は、毎回 if-else-blocks を処理する必要はありません