防止依赖Java/Kotlin中的类,但允许扩展

防止依赖Java/Kotlin中的类,但允许扩展,java,android,oop,design-patterns,kotlin,Java,Android,Oop,Design Patterns,Kotlin,我希望用一些受保护的方法和钩子创建一个有用的Java基类,这样子类就可以很容易地实现 但是,我希望这个类只能用于派生子类,而不能作为依赖项使用。 原因是为了防止一些初级/粗心的开发人员将其代码耦合到此基类 例如,如果我的基类名为BaseActivity.java,任何人都可以创建自己的基类 public class MyNewActivity extends BaseActivity 但是,没有人可以使用字段或方法签名直接引用BaseActivity,例如,这是不允许的: public voi

我希望用一些受保护的方法和钩子创建一个有用的Java基类,这样子类就可以很容易地实现

但是,我希望这个类只能用于派生子类,而不能作为依赖项使用。 原因是为了防止一些初级/粗心的开发人员将其代码耦合到此基类

例如,如果我的基类名为BaseActivity.java,任何人都可以创建自己的基类

public class MyNewActivity extends BaseActivity
但是,没有人可以使用字段或方法签名直接引用BaseActivity,例如,这是不允许的:

public void doSomethingOnBaseActivity(BaseActivity activity);

private BaseActivity someField;

public BaseActivity getActivity();
有没有办法在Java中实现这样的限制? 也许在科特林这是可能的

编辑: 这不是一个复制品。
我希望防止依赖于基类,而不仅仅是实例化。“抽象”在这里没有帮助。

首先,让我们谈谈原因。你为什么要找这个您正在寻找一种方法来防止使用者对基类调用不需要的方法。

如果你认为你在找别的东西,再想想。如果你只是想隐藏它,再想想。最终用户根本不关心实现细节


如果您创建了基类,那么首先不要发布允许该基类的API。在这本书中有一章专门论述这一点

如果你的基类扩展了另一个基类,你就有麻烦了如果要扩展而不是封装,则不能隐藏已发布的API

我希望这个类只能用于派生子类,而不能作为依赖项使用。有没有办法在Java中实现这样的限制?也许在科特林这是可能的

不,这不是意见,这是故意的


可能有一种复杂的方法隐藏父类的方法,但不隐藏使用者与之交互的类(扩展)上的方法

您可以在自己的Gradle模块和设置
实现
类型依赖项中有几层基类,但是如果您可以扩展该类,如果您可以看到它,引用它,那么您也可以在任何地方使用它

想象一下:

  • 消费者模块->
    ConsumerActivity
    扩展
    ExtensibleActivity
  • 您的库模块->
    扩展活动
    扩展
    基本活动
  • 您的基本库模块->
    BaseActivity
    扩展了
    Activity
  • Android SDK->
    活动
消费者模块只能看到“您的库模块”中的内容。它知道扩展性活动,但看不到它的任何超级类型。消费者仍然可以引用扩展活动及其方法。副作用是因为从消费者的角度看,超类是未知的,所以不能将
扩展活动的实例作为
活动
传递,因为类型系统不知道它扩展了
活动
,因为它看不到
基本活动
中间类型。以下是消费者看到的图形:

ConsumerActivity -> ExtensibleActivity -> BaseActivity (doesn't exist) -> ??? (don't know)
在这一点上,你只需要问自己“这是否应该首先扩展
活动”

这太可怕了。为了一些你不需要担心的事情浪费了很多精力


如果要隐藏某些内容,请使用组合而不是继承。将您的逻辑放在
片段中
,或者更好的是,将您的逻辑放在定制的生命周期感知组件中。这样,您就可以完全控制API了。这样你就不必担心它是从哪里来的

为您的代码编写良好的文档和使用手册

如果我用错了,请允许我打破你那该死的图书馆


您的API中有多个方法吗?伟大的没有人会阻止我说他们不正常。你可以在你的手册中写下它应该如何使用,但最终,我是在写我的程序,使用你的库,如果我做错了,那么它坏了就是我的错。这很好。

首先,让我们谈谈原因。你为什么要找这个您正在寻找一种方法来防止使用者对基类调用不需要的方法。

如果你认为你在找别的东西,再想想。如果你只是想隐藏它,再想想。最终用户根本不关心实现细节


如果您创建了基类,那么首先不要发布允许该基类的API。在这本书中有一章专门论述这一点

如果你的基类扩展了另一个基类,你就有麻烦了如果要扩展而不是封装,则不能隐藏已发布的API

我希望这个类只能用于派生子类,而不能作为依赖项使用。有没有办法在Java中实现这样的限制?也许在科特林这是可能的

不,这不是意见,这是故意的


可能有一种复杂的方法隐藏父类的方法,但不隐藏使用者与之交互的类(扩展)上的方法

您可以在自己的Gradle模块和设置
实现
类型依赖项中有几层基类,但是如果您可以扩展该类,如果您可以看到它,引用它,那么您也可以在任何地方使用它

想象一下:

  • 消费者模块->
    ConsumerActivity
    扩展
    ExtensibleActivity
  • 您的库模块->
    扩展活动
    扩展
    基本活动
  • 您的基本库模块->
    BaseActivity
    扩展了
    Activity
  • Android SDK->
    活动
公司