类的标记方法在Java中是框架私有的

时间:2012-10-08 21:43:46

标签: java design-patterns frameworks

我正在编写一些框架代码。最近,我不得不在一个需要公开的类中添加一些方法,因为该类之外的类需要访问它。 该类的客户端也可以访问该类,但我没有这些方法可以被我的客户端访问 - 我只是希望它们对框架中的其他框架类可见。

将它们标记为公开并没有帮助,因为我的客户也可以访问它。 将其标记为受保护或包私有没有帮助,因为此类java包之外的框架类需要访问它。

我该怎么做才能解决这个问题?

谢谢!

7 个答案:

答案 0 :(得分:1)

我不知道你正在使用什么框架,但如果你有方面,你可以根据来电或凭证限制对该套餐的调用。

我很难协调“有权访问课程”和“无法访问的方法”。这是什么?如果你不能调用它的方法,对类的访问意味着什么?

我想知道你的框架增加了什么样的东西,而不像Spring那样更好。

答案 1 :(得分:0)

我可以想到,您无法进行其他编译时检查。除了您描述的那个之外,Java没有任何其他可见性修饰符。

如果要限制某些方法只能由框架访问,则应首先考虑重构框架以使用“包私有”可见性级别。 public有一个非常明确的语义,意味着每个人都可以访问它。如果某些内容仅供您的框架使用,那么它应该是protected或“包私有”,以便其他任何人都无法看到它。

可以在运行时通过使用StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()检查哪个类调用你的方法来做某事,但这不会很好(因为它会产生异常)和我谨慎对待它。

编辑:通过使用here描述的方法,可以更有效地找出调用类。

答案 2 :(得分:0)

阅读您的帖子,提醒我之前在apidesign.org上发布的一些名为FriendPackages的内容。我没有使用过这个解决方案,但我认为这是一个有趣的阅读。

答案 3 :(得分:0)

当基类属于“框架”包时继承,在包可见性时声明“仅框架”方法。

只有“框架”包可以调用它们。

答案 4 :(得分:0)

一些解决方案:

  1. 定义一个“公共”界面,这是您的客户知道的界面,而您的类实现了另一个“内部”界面,扩展了这个“公共”界面。
  2. 使用某种模块管理框架,例如OSGIJava8 modules

答案 5 :(得分:0)

  • 制作名为MyService
  • 的界面
  • 将您喜爱的方法存取在该界面中。
  • 实现两个不同版本。一个用于远程,一个用于内部使用
  • 为了保护您的方法,请为您的客户端版本实施添加return new IllegalAccessException()
  • 使用将返回实现的单例外观:public static MyService getService(Boolean client)

答案 6 :(得分:0)

在其他答案中有一些有趣且有用的建议,特别是双界面的想法。

但我的看法是你不应该太努力实现访问控制或强制执行A​​PI规则。事实上,无论你做什么,人们都能够围绕你提出的任何障碍进行编程,以防止他们的程序使用“内部”接口。唯一可以阻止它的方法是强制它们在安全沙箱中运行它们的代码。我怀疑这是否切实可行,更不用说可以接受了。

无论如何,尽量让它尽可能清楚地表明客户代码使用内部API是一个糟糕的IDEA。但是不要添加大量额外的代码,昂贵的运行时检查以及其他会阻碍的东西。将您的客户视为负责任的成年人如果他们想忽视你的强烈建议,就让他们处理后果。