Tag: inheritance

Hibernate的每子类表inheritance策略的效率

我正在考虑Hibernate管理的类层次结构的表布局,当然每个子类技术的表格在一般意义上都是最合适的。 但是,通过逻辑思考我对其性能有一些担忧,特别是随着子类数量的增加。 为了给出一个非常简短(和经典)的例子,假设您有以下类: public abstract class Animal { int pkey; String name; } public class Dog extends Animal { long numSlippersChewed; // int is not large enough… } public class Cat extends Animal { short miceCaught; // … but here int is far bigger than required 🙂 } (我正在消除getter和setter以及Hibernate映射等,只是假设它们是基本明显的情况)。 这些实体的数据库表是有意义的,你得到了很好的非规范化等等。 但是,Hibernate为了掏出一只动物做了什么查询呢? 我可以想到至少有两种可能发生这种情况的情况: 一些其他实体具有一对一(或一对多)映射,例如Human类的pet字段。 这将存储pkey,因此当Hibernate获取Human对象时,它也需要获取相应的Animal对象。 当给出动物的密钥时,Hibernate将使用什么查询(/ […]

为什么在子类上调用在其超类中声明的静态方法时,不会调用子类的静态初始化程序?

鉴于以下类别: public abstract class Super { protected static Object staticVar; protected static void staticMethod() { System.out.println( staticVar ); } } public class Sub extends Super { static { staticVar = new Object(); } // Declaring a method with the same signature here, // thus hiding Super.staticMethod(), avoids staticVar being null /* public static void staticMethod() […]

确定方法是否在运行时覆盖另一个方法

我想知道是否有任何方法可以确定给定的java.lang.Method对象所代表的方法是否会覆盖另一个java.lang.Method对象所代表的另一个方法? 我正在研究Stronlgy类型的javascript ,我需要能够知道一个方法是否覆盖了另一个方法,以便能够将它们重命名为更短的名称。 在这种情况下,我正在谈论覆盖的扩展定义,由@Override注释支持,其中包括接口和抽象类方法的实现。 我对任何涉及直接reflection或使用任何已经执行此操作的库的解决方案感到满意。

Java Listenerinheritance

我有一个java类来触发自定义java事件。 代码的结构如下: public class AEvent extends EventObject { … } public interface AListener extends EventListener { public void event1(AEvent event); } public class A { public synchronized void addAListener(AListener l) { .. } public synchronized void removeAListener(AListener l) { .. } protected void fireAListenerEvent1(AEvent event) { .. } } 一切正常,但我想创建一个新的A子类(称之为B),它可能会触发一个新的事件。 我正在考虑以下修改: public class BEvent extends […]

如何在Java中实现与单应性方法的接口?

在英语中,同形异义词对是两个具有相同拼写但含义不同的单词。 在软件工程中,一对同形方法是两种具有相同名称但要求不同的方法。 让我们看一个人为的例子,让问题尽可能清晰: interface I1 { /** return 1 */ int f() } interface I2 { /** return 2*/ int f() } interface I12 extends I1, I2 {} 我该如何实施I12 ? C# 有办法做到这一点,但Java没有。 所以唯一的方法是破解。 怎样才能最可靠地完成reflection/字节码技巧/等等(即它不一定是一个完美的解决方案,我只想要一个效果最好的解决方案)? 请注意,我不能合法地逆向工程的一些现有的闭源大量遗留代码需要I12类型的参数,并将I12委托给具有I1作为参数的代码,以及将I2作为参数的代码。 所以基本上我需要创建一个I12的实例,知道它何时应该充当I1 ,何时它应该充当I2 ,我相信可以通过在直接调用者的运行时查看字节码来完成。 我们可以假设调用者没有使用reflection,因为这是简单的代码。 问题是I12的作者没想到Java会从两个接口合并f ,所以现在我必须想出最好的解决问题的方法。 没有什么能调用I12.f (显然如果作者写了一些实际上叫做I12.f代码,他会在出售之前注意到这个问题)。 请注意,我实际上是在寻找这个问题的答案,而不是如何重构我无法改变的代码。 我正在寻找最好的启发式方法,或者如果存在的话,可以找到精确的解决方案。 请参阅Gray的答案以获得有效示例(我确信有更强大的解决方案)。 这是一个具体的例子,说明两个接口内的单应方法问题是如何发生的。 这是另一个具体的例子: 我有以下6个简单的类/接口。 它类似于剧院周围的商业和在其中表演的艺术家。 为了简单起见,我们假设它们都是由不同的人创建的。 Set代表一个集合,如集合论: interface Set { […]

嵌套类中私有构造函数的范围

这不仅仅是一个难题而不是问题。 我有以下代码: public class PrivateBaseConstructor { public static class BaseClass { private BaseClass() { } } public static class DerivedClass extends BaseClass { public DerivedClass() { super(); // 1* } } } 这里调用super(); 虽然基类构造函数是private但是1 *是允许的事件。 如果我们将类作为单独的类编写在同一个包中: BClass.java public class BClass { private BClass() { } } DClass.java public class DClass extends BClass { public DClass() […]

方法返回类型以实现多个接口

是否可以指定一个返回实现两个或多个接口的对象的方法? 假设我们有以下接口: interface FooBar { [Foo] & [Bar] getFooBar(); } interface Foo { void doFoo(); } inteface Bar { void doBar(); } FooBar实现者需要提供getFooBar()方法,该方法返回一个满足Foo和Bar的类型的实例。 我到目前为止尝试的是使用generics: interface FooBar { T getFooBar() } class SomeImplementor implements FooBar { private FooAndBarImpl fSomeField; public T getFooBar() { return fSomeField; } } 鉴于FooAndBarImpl是由框架或库提供的某种类型并实现Foo和Bar我认为应该可行。 但是,它没有,因为“FooAndBarImpl无法转换为T”。 这是为什么? getFooBar()隐含的合同没有像我看到的那样被打破。 另一个解决方案是定义一个扩展Foo和Bar的新接口,并将其用作返回类型。 我在getFooBar()实现中返回fSomeField的空包装时没有多大意义。 编辑: 如果有人能解释为什么generics方法不起作用,我将不胜感激。 我只是没有看到它。

有没有办法保证接口扩展Java中的类?

假设我有以下情况: public abstract class Vehicle { public void turnOn() { … } } public interface Flier { public void fly(); } 有没有办法可以保证任何实现Flier类都必须扩展Vehicle ? 我不想让Flier成为一个抽象类,因为我希望能够以类似的方式混合其他一些接口。 例如: // I also want to guarantee any class that implements Car must also implement Vehicle public interface Car { public void honk(); } // I want the compiler to either […]

Javainheritance字段

我无法理解以下输出。 我不知道为什么输出是10,我认为A a = new B()创建了一个B类的新实例,我认为结果应该是20 class A { int i = 10; } class B extends A { int i = 20; } public class MainClass { public static void main(String[] args) { A a = new B(); System.out.println(ai); } } 为什么这样工作..请解释。

Java是否具有“是一种类”的测试方法

我有一个基类, Statement ,其他几个类inheritance,名为IfStatement , WhereStatement等…在if语句中执行测试以确定实例派生的Statement类的最佳方法是什么?