【问题标题】:Cleaner way of creating multiple objects from base class从基类创建多个对象的更简洁方法
【发布时间】:2016-08-16 00:20:59
【问题描述】:

假设我有一个名为 BaseClass 的类,它看起来像这样

class BaseClass{
    String var1;
    int var2;

    public void methodToBeOverridden(){}
}

我需要创建大量继承此类的类。它们都将覆盖methodToBeOverridden(),但都将在静态上下文中实例化。由于它们都需要是静态的,因此据我所知,它们不能放在单个 .class 文件中。有没有比为每个实例创建一个单独的 .class 文件更简洁的方法呢?我真的怀疑有,但我想我会在开始之前在这里问一下,以防万一。

【问题讨论】:

  • 您可以在同一个类文件中创建static nested classes。如果它们不是公开的,您还可以在一个文件中声明多个顶级类,但通常不鼓励这样做。
  • 我不认为这个 BaseClass 是必要的。我建议使用枚举来实现它。
  • 也许也是功能接口和方法句柄的工作。您可以在一个类中包含所有变体。

标签: java static instantiation


【解决方案1】:

我采用的一种方法是覆盖实现 interfaceenum 的实现 来自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 文件。

【讨论】:

  • 我不会撒谎,我不知道那是什么。但是你把我引向了枚举的方向,它完美无缺。
【解决方案2】:

我严重怀疑这些类中的每一个在methodToBeOverridden 中都有显着不同的代码。它们可能都因某些数据而有所不同——或者它们可能属于这样的几个家族——你应该将该数据作为类的构造函数参数,并且如果有派生类,则不要有很少的派生类。

【讨论】:

  • 你根据什么证据严重怀疑?或者这仅仅是猜测?
  • @EJP 基于我在 Java 方面的经验。听起来像是一种设计气味,这可能就是原因。如果 OP 发布更多内容,我会很感兴趣,但与此同时,我可能留下了一个非常重要的暗示,希望会让他们停止编码。我也可能是错的,这很好。
  • 你知道他们对做出假设的看法。 ;)
猜你喜欢
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多