1

我有一系列共享公共代码的类,,,A... BC总共几十个)。每个类可以有很多实例A,,, B...。C我打算创建一个超类,Abstract它将包含该代码。

问题是,常见的东西适用于每个类(而不是每个实例)唯一的对象。这目前通过A, B, C... 每个都有一个具有相应值的静态字段来解决。显然,当我将功能重构为 时Abstract,需要将其更改为其他内容。

在实践中,它目前看起来像这样(注意实际类型不是String,这只是为了演示目的):

public class A implements CommonInterface {

    private static final String specificVar = "A";

    @Override
    public void common() {
        specificVar.contains('');
    }
}
public class B implements CommonInterface {

    private static final String specificVar = "B";

    @Override
    public void common() {
        specificVar.contains('');
    }
}

到目前为止,我想出的最好的想法是在, , , ... 中有一个Map<Class<? extends Abstract>,K>K相关类型在哪里)静态字段,每个字段都包含一个静态初始化块,用于将相关值放入映射中。但是,我不相信这是可以做到的最好的。AbstractABC

请注意,我没有使用任何 DI 框架。

那么,就子类中包含的代码而言,在不牺牲字段访问效率的情况下,重构由公共代码处理的...中的静态字段的最简洁的方法是什么?ABC

4

3 回答 3

0

也许你想要一个枚举。

enum MyInstances implements MyInterface {
    A {
       fields and methods for A
    }, B {
       fields and methods for B
    };
    common fields for all MyInstances 

    common methods for all MyInstances 
}

// To lookup an instance
MyInstances mi = MyInstances.valueOf("A");
于 2012-08-08T12:05:28.943 回答
0

由于您没有展示任何源代码,因此我们无法真正判断使用静态字段是好的还是坏的设计选择。

考虑到子类使用静态字段确实是一个不错的设计选择,在超类中使用公共代码访问它们的第一种方法是调用将在子类中实现的抽象方法。

例子:

public abstract class SuperClass {
    public void processCommonLogic() {
        // Common logic

        // Execute specific logic in subclasses
        processSpecificLogic();
    }

    public abstract void processCommonLogic();
}

public class ASubClass extends SuperClass {
    public static int SPECIFIC_SUBCLASS_CONSTANT = 0;

    public void processSpecificLogic() {
        // Specific subclass logic
        doSomethingWith(ASubClass.SPECIFIC_SUBCLASS_CONSTANT);
    }
}
于 2012-08-08T12:10:01.453 回答
0

您可以使用模板方法模式

在您的抽象类中定义一个抽象方法getValue(),并在您需要该值的任何地方在您的抽象类中使用。然后,您的每个子类只需要实现 getValue 方法并为该子类返回正确的值。

于 2012-08-08T12:10:01.813 回答