从基础 class 创建多个对象的更简洁方法
Cleaner way of creating multiple objects from base class
假设我有一个 class,叫做 BaseClass,看起来像这样
class BaseClass{
String var1;
int var2;
public void methodToBeOverridden(){}
}
我需要创建大量继承此 class 的 classes。它们都将覆盖 methodToBeOverridden()
,但都将在静态上下文中实例化。因为它们都需要是静态的,所以根据我的理解,它们不能放在一个单一的 .class 文件中。有没有比为每个实例创建一个单独的 .class 文件更简洁的方法来做到这一点?我真的怀疑是否存在,但我想在我开始之前先在这里问一下,以防万一。
我严重怀疑这些 classes 中的每一个在 methodToBeOverridden
中都有完全不同的代码。它们可能在某些数据上有所不同 - 或者它们可能属于这样的几个家族 - 你应该让那部分数据成为 class 的构造函数参数并且没有很少的派生 class如果有的话。
我采用的一种方法是覆盖实现 interface
的 enum
的实现
来自 https://github.com/OpenHFT/Chronicle-Engine/blob/master/src/main/java/net/openhft/chronicle/engine/map/remote/MapFunction.java
public enum MapFunction implements SerializableBiFunction<MapView, Object, Object> {
CONTAINS_VALUE {
@Override
public Boolean apply(@NotNull MapView map, Object value) {
Class vClass = map.valueType();
return map.containsValue(convertTo(vClass, value));
}
},
REMOVE {
@Override
public Object apply(@NotNull MapView map, Object o) {
Class kClass = map.keyType();
Class vClass = map.valueType();
KeyValuePair kf = (KeyValuePair) o;
return map.remove(convertTo(kClass, kf.key), convertTo(vClass, kf.value));
}
},
REPLACE {
@Override
public Object apply(@NotNull MapView map, Object o) {
Class kClass = map.keyType();
Class vClass = map.valueType();
if (o instanceof KeyValuePair) {
KeyValuePair kf = (KeyValuePair) o;
return map.replace(convertTo(kClass, kf.key), convertTo(vClass, kf.value));
}
KeyValuesTuple kf = (KeyValuesTuple) o;
return map.replace(convertTo(kClass, kf.key), convertTo(vClass, kf.oldValue), convertTo(vClass, kf.value));
}
},
这使我可以在单个 .java
文件中实现同一方法的多个实现。注意:这仍然会创建多个 .class
个文件。
假设我有一个 class,叫做 BaseClass,看起来像这样
class BaseClass{
String var1;
int var2;
public void methodToBeOverridden(){}
}
我需要创建大量继承此 class 的 classes。它们都将覆盖 methodToBeOverridden()
,但都将在静态上下文中实例化。因为它们都需要是静态的,所以根据我的理解,它们不能放在一个单一的 .class 文件中。有没有比为每个实例创建一个单独的 .class 文件更简洁的方法来做到这一点?我真的怀疑是否存在,但我想在我开始之前先在这里问一下,以防万一。
我严重怀疑这些 classes 中的每一个在 methodToBeOverridden
中都有完全不同的代码。它们可能在某些数据上有所不同 - 或者它们可能属于这样的几个家族 - 你应该让那部分数据成为 class 的构造函数参数并且没有很少的派生 class如果有的话。
我采用的一种方法是覆盖实现 interface
的 enum
的实现
来自 https://github.com/OpenHFT/Chronicle-Engine/blob/master/src/main/java/net/openhft/chronicle/engine/map/remote/MapFunction.java
public enum MapFunction implements SerializableBiFunction<MapView, Object, Object> {
CONTAINS_VALUE {
@Override
public Boolean apply(@NotNull MapView map, Object value) {
Class vClass = map.valueType();
return map.containsValue(convertTo(vClass, value));
}
},
REMOVE {
@Override
public Object apply(@NotNull MapView map, Object o) {
Class kClass = map.keyType();
Class vClass = map.valueType();
KeyValuePair kf = (KeyValuePair) o;
return map.remove(convertTo(kClass, kf.key), convertTo(vClass, kf.value));
}
},
REPLACE {
@Override
public Object apply(@NotNull MapView map, Object o) {
Class kClass = map.keyType();
Class vClass = map.valueType();
if (o instanceof KeyValuePair) {
KeyValuePair kf = (KeyValuePair) o;
return map.replace(convertTo(kClass, kf.key), convertTo(vClass, kf.value));
}
KeyValuesTuple kf = (KeyValuesTuple) o;
return map.replace(convertTo(kClass, kf.key), convertTo(vClass, kf.oldValue), convertTo(vClass, kf.value));
}
},
这使我可以在单个 .java
文件中实现同一方法的多个实现。注意:这仍然会创建多个 .class
个文件。