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