禁止在其包外部直接扩展Java类

jju*_*uma 5 java inheritance api-design

我有一个包

public abstract class Player { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

还有这些

public abstract class GamePlayer extends Player { /*...*/ }
public abstract class TournamentPlayer extends Player { /*...*/ }
public abstract class StatelessPlayer extends Player { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

该软件包的用户需要玩家,但为了在不破坏它的情况下使用该软件包,我要求他们永远不要直接扩展播放器.相反,他们应该扩展提供的子类之一.

问题:我应该如何阻止用户直接扩展播放器?

我正在寻找一种能明显禁止这种禁令的方法.

Jon*_*eet 18

使构造函数Player仅具有包访问权限.然后他们将无法调用构造函数或自己扩展它.如果你不已经在明确的构造函数Player,创建一个(否则编译器会创建一个默认的公共参数构造函数).

(请注意,我只建议对构造函数执行此操作.类本身可以是公共的,以便客户端仍然可以使用它.)

这是有效的,因为任何构造函数(除了in java.lang.Object)都必须调用超类构造函数(显式或隐式).如果没有可访问的构造函数,则无法创建子类.


Lee*_*Lee 9

确保Player的构造函数不公开:

public abstract class Player {
    Player() {
        // initialization goes here
    }
}
Run Code Online (Sandbox Code Playgroud)

然后类可以从同一个包中扩展Player,但不能从包外部扩展.