是否在抽象类中保存对多个对象的静态引用?

时间:2017-09-14 18:31:46

标签: java performance inheritance

关于以下模式,在性能,内存消耗,设计等方面是否有任何明显的不足?

public abstract class A {
    public static final D d = new D();
    public static final C c = new C();
    ......... and many more member of class B, C, and D; like hundreds
}

public class B extends A {
}

public class C extends B {
}

public class D extends C {
}

2 个答案:

答案 0 :(得分:1)

  

关于以下模式,在性能,内存消耗,设计等方面是否有任何明显的不足?

  1. 表现 - 不是真的。

  2. 内存 - 不,如果你(1)对可以创建多少内部对象有可预测的界限(你可以使用他们将占用的内存),(2)有一个对这些对象的生命周期的好主意,(3)你确信你的抽象类不会被泄露。否则,答案是可能

  3. 设计 - 是的。从设计的角度来看,你试图做的事情很糟糕。很难说出你实际想要实现的目标,但是你可以更好地设计你的架构的机会相当高。

答案 1 :(得分:-3)

它没有任何问题。

我建议使用接口:

public interface A {
    D d = new D();
    C c = new C();
    ......... and many more member of class B, C, and D; like hundreds
}

因为默认情况下,作为字段的接口成员被视为public static final成员,这正是您使用抽象类所做的。

如果抽象类(如您的问题所暗示的)仅包含那些静态字段,我只建议这样做。否则,你现在拥有它的方式很好。

编辑:OP增加了关于设计的问题

在设计方面,这是一个糟糕的设计,因为抽象类知道它的子类型,而不是简单地依赖于指定它的行为,而将其余部分留给其他类可以聚合父类和子元素的行为来实现其他一些结果。

在这种情况下,我要做的是让子类只相互独立,让它们只实现不依赖于A的行为

所以你将有一个班级:

public class B {

}

public class C {

}

public class D {

}

现在你创建另一个类:

public class UseBCD {
    public static final B b;
    public static final C c;
    public static final D d;
    // define all the behaviour of class A, plus use the classes as you like
}

现在你将依赖关系作为单向而非紧密耦合。

如果您发现自己无法BCD分开,那么您很可能只需要一个能完成所有事情的课程{{ 1}}确实。