Java类和包的设计

Java类和包的设计,java,class,oop,design-patterns,packages,Java,Class,Oop,Design Patterns,Packages,我有一个上下文类->prototype.context->应用程序可以创建对象,但不能扩展。但是,系统开发人员可以将类扩展到更多类型。系统类的包将是prototype.system和prototype.dbengine。这些类应该具有对上下文对象的完全访问权限,但其他类不应该 如果我将上下文类中的字段保留为包访问,这些类将无法访问它,因为它们来自不同的包。那么我应该如何命名包,以便其他开发人员可以使用这些类,还可以完全访问系统类?让系统和数据库引擎类在上下文中扩展必要的类,并设置系统和数据库引擎

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


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

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

如果您必须使用包专用访问和/或无法使用
受保护的
,那么实际上,除了使用
public
之外,您唯一的选择就是将所有内容都放在同一个包中

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


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

>你想要的实际上是对C++好友类特性的模拟。这里描述了一个很好的技巧:

访问与名称无关。包访问基于包名称工作,对吗?有关类似问题的更多信息:A)更喜欢组合而不是继承。您可能应该让您的所有类都独立并委托给另一个类,而不是在最简单的情况下继承。不过,它们都应该实现相同的接口。您可以在以前将父/基类作为参数的方法中使用此接口。B) 为什么要阻止用户扩展类?这种决策让人们认为OO是不好的——因为有人任意(通常是故意)限制了他们的灵活性。继承是设计中非常重要的一部分,因为它允许创建更多形式的基类类型。我不能限制、阻止或不喜欢继承,因为这不是我试图设计的。我需要使用这些类中的对象,所以扩展类无助于解决问题,谢谢。如果没有其他更好的答案,我会接受你的答案。我已经改变了答案,因为我发现Honza Zidek的解决方案解决了我的问题。也谢谢你:)嗯,我以前从没听说过这个概念。有趣的解决方案!这种设计模式限制了类在其他方面的使用,它不能按我希望的方式工作。而且,这里也不要求有相互的工作类。虽然起初我对此表示怀疑,但我已经设法使用friend函数得到了解决方案。谢谢:)这是我的荣幸:)能帮助你,也能用Java学习这个绝妙的技巧:)