Java 性能/灵活性与类实例或扩展类实例相同

Java 性能/灵活性与类实例或扩展类实例相同,java,performance,Java,Performance,我正在使用两个库,我需要一个库中的类来实现另一个库中的功能。我的第一次尝试是获取库A的源代码,并使类从库B扩展类。除了大量的修复等工作外,其他工作还不错,因为这些工作不能使代码变得稳定等,更新其中一个库就成了地狱 像这样: abstract class classA extends classB{ } abstract class newClass extends classB{ private classA A = new classA(); public void exa

我正在使用两个库,我需要一个库中的类来实现另一个库中的功能。我的第一次尝试是获取库A的源代码,并使类从库B扩展类。除了大量的修复等工作外,其他工作还不错,因为这些工作不能使代码变得稳定等,更新其中一个库就成了地狱

像这样:

abstract class classA extends classB{
}
abstract class newClass extends classB{
    private classA A = new classA();

    public void exampleMethod(){
        A.exampleMethod();
    }
}
现在我也在考虑这样做:

abstract class classA extends classB{
}
abstract class newClass extends classB{
    private classA A = new classA();

    public void exampleMethod(){
        A.exampleMethod();
    }
}

第二个选项性能差吗?如果是,有多糟糕?

好吧,Erich Gamma在GoF书的第一章中说:“支持对象组合而不是类继承”。请参阅:.

好吧,Erich Gamma在GoF书的第一章中指出:“支持对象组合而不是类继承”。请参阅:.

出于各种原因,这里需要通过委托形式进行扩展(mixin),但最重要的是您(可能)以非规范的方式扩展第三方库类

但这都是猜测,因为我们不知道你们在谈论什么库。例如,它可能是一个写得很差的库,
classA
(使用您的示例)实际上不应该扩展,但作者忽略了规范
最终的classA
,等等。如果是这样,那么显然您不想扩展该类(即使您可以)

综上所述,考虑到您(a)只需要共享功能,(b)不需要多态语义,委托形式非常有意义

关于表现焦虑的建议:基准测试

不要忽视最终结果——JIT是你的朋友(善待它并喂养它):


出于各种原因,这里需要通过委托形式进行扩展(mixin),但最重要的是您(可能)以非规范的方式扩展第三方库类

但这都是猜测,因为我们不知道你们在谈论什么库。例如,它可能是一个写得很差的库,
classA
(使用您的示例)实际上不应该扩展,但作者忽略了规范
最终的classA
,等等。如果是这样,那么显然您不想扩展该类(即使您可以)

综上所述,考虑到您(a)只需要共享功能,(b)不需要多态语义,委托形式非常有意义

关于表现焦虑的建议:基准测试

不要忽视最终结果——JIT是你的朋友(善待它并喂养它):


exampleMethod()
移动到
classB
怎么样?要解决这个问题,有一个更具体的例子会更容易。顺便说一句,根据Java编码惯例检查类和字段的命名,然后我会再次修改库中的一个类,这是我想要摆脱的。就我个人而言,这意味着要将两个相当大的库合并起来,这两个库依赖于许多超类,这些超类也需要合并才能保留所有功能。将
exampleMethod()
移动到
classB
怎么样?要解决这个问题,有一个更具体的例子会更容易。顺便说一句,根据Java编码惯例检查类和字段的命名,然后我会再次修改库中的一个类,这是我想要摆脱的。就我个人而言,这意味着要将两个相当大的库合并起来,这两个库依赖于许多超类,这些超类也需要合并才能保留所有功能。不知道这是谁,但他的论点似乎足够有效,可以使用对象合成来制作原型。换句话说,避免过早优化。不知道是谁这是但他的论点似乎足够有效,可以使用对象合成来制作原型,或者换句话说:避免过早优化。虽然我同意将
a
final作为一个好主意,但我不认为这会对JIT产生什么影响。final应该决定性地通知JIT委托调用堆栈(引用)永远不会改变,并且可以在没有任何启发的情况下崩溃。(我相信你在预热后是正确的。)虽然我同意将
设为final是一个好主意,但我不认为这会对JIT产生什么影响。final应该决定性地通知JIT委托调用堆栈(引用)永远不会更改,并且可以在没有任何启发的情况下折叠。(但我相信,一旦它升温,你是对的。)