我有5或6个类,我希望它们在内部遵循相同的基本结构。实际上,这些类应该遵循的大多数规则仅供函数本身使用,因此我真的希望这些方法是私有的。
有没有办法实现这一点?我知道接口非常适合,但它们不会使用私有成员,并且不允许您重新定义实现方法中的作用域。有没有解决这个问题的方法?
谢谢
我有5或6个类,我希望它们在内部遵循相同的基本结构。实际上,这些类应该遵循的大多数规则仅供函数本身使用,因此我真的希望这些方法是私有的。
有没有办法实现这一点?我知道接口非常适合,但它们不会使用私有成员,并且不允许您重新定义实现方法中的作用域。有没有解决这个问题的方法?
谢谢
是否有可能使所有类都继承自同一个基类?
如果是这样,您可以考虑的一件事情是,在基类的构造函数中使用反射来验证子类是否遵循您描述的规则,并在未通过验证规则时抛出异常。
当然,这个测试的天真实现会有显著的性能问题,因此您必须非常聪明地实现测试方式。
首先,该测试应仅对特定子类型T的所有实例运行一次。因此,您需要在某个地方缓存验证信息。一种方法是在基类中使用某种静态(全局)哈希表,以子类型的类型为键。
您还需要在此缓存周围执行某种线程安全同步。您真正需要避免的是读取的性能损失。在类似的情况下,我曾经使用过双重检查锁定模式和不可变哈希表的组合,以便只有在尝试写入哈希表时(即创建特定子类型T的第一个实例时)才会对锁定产生性能影响。
实际上我在Java方面没有经验,我所描述的是在.NET中实现的,这就是为什么我无法提供给您代码示例,但所有的概念都应该很容易地转移到Java - 我提到的所有内容(据我所知)都可以在两个平台上使用。
在你的评论中,你写道:“是的,这就是重点。我知道它们可以被称为不同的东西,但我不想让它们这样。”
现在,有些人可能会说“那是不可能的”,但像编程中的大多数事情一样,它并不实际上是不可能的,只是需要付出很多努力。
如果你真的想做到这一点,你可以为你的类创建一个自定义Java注释,然后编写一个注释处理器,并在构建过程中调用apt。
就像我说的,这需要很多工作,但如果你想学习注释的工作原理,这可能是值得的。
编写注释实际上非常简单。它们的工作方式有点像普通类。例如,如果您只想为某个原因标记一个类,则可以创建一个空的或标记注释,如下所示:
public @interface Car { }
然后在您的注解处理器中,您可以检查确保Car具有正确的私有方法。
我编写了自己的注解,但是我使用反射API在运行时而不是构建时进行了检查。它们实际上非常容易。