Java 无法调用但可以覆盖的方法

Java method that can't be callable but can be overridden

如果我不希望我的 class 上的某个方法可以被调用,我只是将其设为私有。

但是如果我想让那个方法被覆盖,我必须让它受到保护

是否可以在抽象 class 上创建一个无法调用但可以覆盖的方法? (我猜不是,但是有什么解决方法吗?)

用例:

abstract class Super {

  protected void finalize() {

  }

  public final void doThings() {
   // do stuff
   finalize();
  }
}

以及任何想要扩展 class 的人:

class Sub extends Super {

  @Override
  protected void finalize() {
    closeSockets();
    alertSomeone();
  }

}

但我不想让其他 class 打电话给 mySub.finalize();

sub-class 可以为 super-class 提供包含要执行的代码的 Runnable,而不是覆盖方法。你可以这样做:

public class Super {

    private final Runnable subClassCode;

    public Super(Runnable finalizeCode) {
        subClassCode = finalizeCode;
    }

    public final void doThings() {
        // do stuff
        subClassCode.run();
    }

}

public class Sub extends Super {

    public Sub() {
        super(() -> {
            // code to be executed in doThings()
        });
    }

}

您不需要在构造函数中设置Runnable 实例。您还可以授予对受保护的 setFinalizeCode(Runnable) 方法的访问权限,但该方法也可以由与 Super.

相同包内的其他 classes 调用