Java 在抽象类中保持对多个对象的静态引用可以吗?

Java 在抽象类中保持对多个对象的静态引用可以吗?,java,performance,inheritance,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

以下模式在性能、内存消耗、设计等方面是否有明显的不好之处

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 {
}

这没什么问题

不过,我建议使用界面:

public interface A {
    D d = new D();
    C c = new C();
    ......... and many more member of class B, C, and D; like hundreds
}
因为默认情况下,作为字段的接口成员被视为
publicstaticfinal
成员,这正是您使用抽象类所做的

我只建议在抽象类(如您的问题所暗示的)只包含这些静态字段的情况下这样做。否则,您当前拥有它的方式很好

编辑: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
}
现在,依赖关系是单向的,而不是紧密耦合的


如果您发现不能将
B
C
D
分开,那么很可能您实际上只需要一个类来完成
A、B、C和D
所做的一切。

它没有问题

不过,我建议使用界面:

public interface A {
    D d = new D();
    C c = new C();
    ......... and many more member of class B, C, and D; like hundreds
}
因为默认情况下,作为字段的接口成员被视为
publicstaticfinal
成员,这正是您使用抽象类所做的

我只建议在抽象类(如您的问题所暗示的)只包含这些静态字段的情况下这样做。否则,您当前拥有它的方式很好

编辑: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
}
现在,依赖关系是单向的,而不是紧密耦合的

如果您发现不能将
B
C
D
分开,那么很可能您实际上只需要一个类来完成
A、B、C和D
所做的一切

以下模式在性能、内存消耗、设计等方面是否有明显的不好之处

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 {
}
  • 性能-不太好

  • 内存-不,如果您(1)对将创建多少内部对象有可预测的界限(并且您对它们将占用的内存没有问题),(2)对这些对象的寿命有很好的了解,(3)您确信您的抽象类不会泄漏。否则,答案可能是

  • 设计-是。从设计的角度来看,你要做的事情闻起来很难闻。很难说您实际上想要实现什么,但是您能够更好地设计您的体系结构的可能性相当高

  • 以下模式在性能、内存消耗、设计等方面是否有明显的不好之处

    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 {
    }
    
  • 性能-不太好

  • 内存-不,如果您(1)对将创建多少内部对象有可预测的界限(并且您对它们将占用的内存没有问题),(2)对这些对象的寿命有很好的了解,(3)您确信您的抽象类不会泄漏。否则,答案可能是

  • 设计-是。从设计的角度来看,你要做的事情闻起来很难闻。很难说您实际上想要实现什么,但是您能够更好地设计您的体系结构的可能性相当高



  • 我最担心的是设计。不,但可能有一个很大的设计问题。我无法想象拥有数百个单独的静态最终对象有什么好的理由,特别是如果它们不在某个集合中。如果类的全部目的是保存静态对象,则可能需要使用接口。您试图实现什么?忘记性能,这是一个非常可疑的实践——您的抽象类不应该对其子类型有如此明确的认识。我最担心的是设计。不,但可能有一个很大的设计问题。我无法想象拥有数百个单独的静态最终对象有什么好的理由,特别是如果它们不在某个集合中。如果类的全部目的是保存静态对象,则可能需要使用接口。您试图实现什么?忘记性能,这是一种非常可疑的做法——您的抽象类不应该对其子类型有如此明确的认识。这是一种反模式。设计并实现了一个接口。但事实并非如此。只需使用一个常规的final类和一个私有构造函数。如果要使用常量而不在其前面加上类名,请使用静态导入。在这一点上,如果要推荐某些内容,请解释推荐背后的原因。@JBNizet为什么不是这样?在OP的问题中,您没有看到扩展抽象类的其他类吗?使用最后一个类将如何帮助实现这一点?该案例指的是使用具有状态的接口,而不是行为,这是一种反模式。@smac89为了更深入地了解,这称为,这是一种反pa