调用基类版本方法,同时强制重写类,否则抛出异常

时间:2016-01-10 06:40:39

标签: java inheritance exception-handling override custom-exceptions

如果override方法没有显式调用它的super方法,我想抛出一个自定义异常。如果任何类扩展了类A并重写了say()方法,应该强制调用super.say()来执行用基类方法编写的代码,如果失败,我想抛出自定义异常,如超级异常

public void onLocationChanged(Location currentLocation)
{
    Log.d(TAG, "Location Updated");

    latitude = currentLocation.getLatitude();
    longitude = currentLocation.getLongitude();

    Cursor cursor = mDatabaseManager.getAllLocations();
    // Do something
    cursor.close();
}

2 个答案:

答案 0 :(得分:0)

这是@DavidWallace建议的方法,这比你想要的更好,因为它使得子类不可能阻止say()做什么它在基类中执行:

class A {
    public final void say() {
        System.out.println("From super");
        saySomethingElse();
    }

    /**
     * Subclasses can override this method to make the say() method 
     * say something else in addition to "From super".
     */
    protected void saySomethingElse() {
    }
}   

class Demo extends A {
    @Override
    protected void saySomethingElse() {
        System.out.println("From Child");
    }

    public static void main(String[] args) {
        Demo d = new Demo();
        d.say();
    }
}

答案 1 :(得分:0)

使用普通Java在运行时无法可靠地执行此操作。覆盖方法时,新版本完全会覆盖旧版本。因此,当调用该方法时,控制转到子类版本而不是父类版本。无论是否调用超类方法,完全由最重要的方法决定。

执行您想要做的事情有三个主要选项

  • 如果您具有覆盖此方法的子类的编译时访问权限,那么您可以使用静态分析工具(如Checkstyle或Findbugs)来确保该方法调用super()。例如,Findbugs已经有clone()方法的规则。您可以为自己的方法实现类似的规则。

  • 按照@DavidWallace的建议重新设计代码。您面临的根本问题是,您希望控制流到子类,同时您希望确保超类中发生某些事情。如果重新设计代码以使say()方法在超类中是最终的,那么它可以在每个子类实现的超类(称为sayInternal)上调用抽象方法。然后,您可以确定当用户调用say()时,他们首先以超类方法结束,并且超类完全控制子类方法的使用方式。

  • 您可以使用运行时代理在加载类时检查它们。这可以验证是否调用了超类方法并拒绝加载不调用它的类。

相关问题