【问题标题】:design of Java classes and packagesJava类和包的设计
【发布时间】:2014-06-24 16:04:39
【问题描述】:

我有一个上下文类->prototype.context->应用程序可以创建对象,但不能扩展。然而,系统开发人员可以将类扩展到更多类型。系统类的包是prototype.system 和prototype.dbengine。这些类应该可以完全访问上下文对象,但其他类不应该。

如果我将上下文类中的字段保留为包访问,这些类将无法访问它,因为它们来自不同的包。那么我应该如何命名这些包,以便其他开发人员可以使用这些类,并且还可以完全访问系统类?

【问题讨论】:

  • 访问与名字无关。
  • 包访问基于包名,对吧?
  • 更多类似问题的信息:stackoverflow.com/questions/18494938/…
  • A) 更喜欢组合而不是继承。您可能应该让所有类独立并委托给另一个类,而不是在最微不足道的情况下继承。不过,它们都应该实现相同的接口。您将在以前将父/基类作为参数的方法中使用此接口。 B) 为什么要阻止您的用户扩展您的课程?这是一种让人们认为 OO 不好的决定——因为有人武断地(通常是故意地)限制了他们的灵活性。
  • 继承是设计中非常重要的一部分,因为它允许创建更多形式的基类类型。我不能限制或阻止或不喜欢继承,因为这不是我想要设计的

标签: java class oop design-patterns packages


【解决方案1】:

让系统和 dbengine 类在上下文中扩展必要的类,并设置系统和 dbengine 类需要保护的字段/方法。

【讨论】:

  • 我需要使用这些类中的对象,所以扩展类无济于事
【解决方案2】:

如果您绝对必须使用包私有访问和/或不能使用protected,那么您唯一没有使用public 的选择就是将所有内容粘贴到同一个包中。

这是因为在 Java 中,“子包”实际上并不存在——例如,java.utiljava.util.concurrent 是完全不同的包;因此,无论是调用java.util.concurrent 还是调用java.concurrent 从访问范围的角度来看都没有区别。在任何一种情况下,java.util.concurrent 中的类都无法从 java.util 访问包私有成员。命名只是为了方便,并不表示任何实际的层次结构。

因此,无论您如何命名您的包,您都无法从另一个包访问包私有成员。

【讨论】:

  • 解决了问题,谢谢。如果没有其他更好的答案很快出现,我会接受你的答案。
  • 我改变了答案,因为我发现 Honza Zidek 的解决方案已经解决了我的问题。也谢谢你:)
  • 呵呵,我以前从未听说过这个概念。有趣的解决方案!
【解决方案3】:

您想要的实际上是 C++ 友元类功能的模拟。这里描述了一个不错的技巧:https://stackoverflow.com/a/18634125/2886891

【讨论】:

  • 该设计模式限制以其他方式使用类,它不能按我希望的方式工作。而且,这里不要求有相互工作的班级。
  • 虽然最初持怀疑态度,但我已经设法使用朋友功能获得了解决方案。谢谢你:)
  • 我很高兴 :) 帮助您并学习 Java 中的这个绝妙技巧 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 2013-01-25
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多