Java:有没有一种方法可以强制实现私有方法?

6

我有5或6个类,我希望它们在内部遵循相同的基本结构。实际上,这些类应该遵循的大多数规则仅供函数本身使用,因此我真的希望这些方法是私有的。

有没有办法实现这一点?我知道接口非常适合,但它们不会使用私有成员,并且不允许您重新定义实现方法中的作用域。有没有解决这个问题的方法?

谢谢


7
你试图在这里做的事情没有任何意义。私有方法的作用是它们不是类的公共结构的一部分 - 从定义上来讲,你的类应该无论私有方法和字段的结构如何,都会表现出相同的行为。如果你想组件化你的实现,你可以使用抽象方法或将你的类分解成组件,正如其他人在这里建议的那样。你能澄清一下为什么你想这样做吗?如果你只是想简化代码,让所有的代码都呈现出类似的结构,你必须通过约定来完成,语言本身不能强制实施这种变化。 - Steve B.
是的,我认为你说得很对。我想让它强制执行镜像结构。可惜这不能通过语言结构来实现。 - Matthew Stopa
你做错了。封装的全部意义在于你不关心事物是如何实现的,只关心它们的外部行为。语言特性符合良好的工程实践(大多数情况下)。 - Kevin Peterson
1
我必须尊重地不同意那个观点。我在另一条评论中写道,我的目的是在自己的项目中执行编码标准。因此,让Java为我完成这项工作将会非常有帮助,并且通常是一个好的做法(我认为)。 - Matthew Stopa
13个回答

1

是否有可能使所有类都继承自同一个基类?

如果是这样,您可以考虑的一件事情是,在基类的构造函数中使用反射来验证子类是否遵循您描述的规则,并在未通过验证规则时抛出异常。

当然,这个测试的天真实现会有显著的性能问题,因此您必须非常聪明地实现测试方式。

首先,该测试应仅对特定子类型T的所有实例运行一次。因此,您需要在某个地方缓存验证信息。一种方法是在基类中使用某种静态(全局)哈希表,以子类型的类型为键。

您还需要在此缓存周围执行某种线程安全同步。您真正需要避免的是读取的性能损失。在类似的情况下,我曾经使用过双重检查锁定模式和不可变哈希表的组合,以便只有在尝试写入哈希表时(即创建特定子类型T的第一个实例时)才会对锁定产生性能影响。

实际上我在Java方面没有经验,我所描述的是在.NET中实现的,这就是为什么我无法提供给您代码示例,但所有的概念都应该很容易地转移到Java - 我提到的所有内容(据我所知)都可以在两个平台上使用。


0

在你的评论中,你写道:“是的,这就是重点。我知道它们可以被称为不同的东西,但我不想让它们这样。”

现在,有些人可能会说“那是不可能的”,但像编程中的大多数事情一样,它并不实际上是不可能的,只是需要付出很多努力。

如果你真的想做到这一点,你可以为你的类创建一个自定义Java注释,然后编写一个注释处理器,并在构建过程中调用apt。

就像我说的,这需要很多工作,但如果你想学习注释的工作原理,这可能是值得的。


编写注释实际上非常简单。它们的工作方式有点像普通类。例如,如果您只想为某个原因标记一个类,则可以创建一个空的或标记注释,如下所示:

public @interface Car { }

然后在您的注解处理器中,您可以检查确保Car具有正确的私有方法。

我编写了自己的注解,但是我使用反射API在运行时而不是构建时进行了检查。它们实际上非常容易。


0
这里有一个想法:编写一个简单的文本解析器来检查方法是否存在。将其作为Ant中的一个任务包含进去。只要您坚持某种形式的编码标准,一些简单的文本匹配就可以做到,即在所需的源文件中查找格式化签名即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接