只包含私有成员的Java类

只包含私有成员的Java类,java,oop,encapsulation,information-hiding,Java,Oop,Encapsulation,Information Hiding,最近我遇到了一个情况,我需要为我的android应用程序创建一个定制。我需要访问MediaPlayer对象并添加一些侦听器 不幸的是(对我来说),VideoView类的所有成员都是私有的,因此即使扩展该类也不能帮助我获得对其MediaPlayer对象(或任何其他对象)的访问权,我必须在修改后对该类进行完全复制 好吧,虽然听起来我在抱怨“辛苦工作”,但在这种情况下,它比扩展类更容易(因为所有源代码都可用…),但这让我真的怀疑这种信息隐藏方法这比让主要组件可以修改/访问(受保护,而非公开)更好吗?我

最近我遇到了一个情况,我需要为我的android应用程序创建一个定制。我需要访问MediaPlayer对象并添加一些侦听器

不幸的是(对我来说),VideoView类的所有成员都是私有的,因此即使扩展该类也不能帮助我获得对其MediaPlayer对象(或任何其他对象)的访问权,我必须在修改后对该类进行完全复制


好吧,虽然听起来我在抱怨“辛苦工作”,但在这种情况下,它比扩展类更容易(因为所有源代码都可用…),但这让我真的怀疑这种信息隐藏方法这比让主要组件可以修改/访问(受保护,而非公开)更好吗?我的意思是,我理解如果我扩展VideoView类,有一天他们可能会更改VideoView类中的某些内容,我可能会遇到麻烦,但如果他们更改该类,我自己的(重复)版本将与VideoView类有更大的区别,我的目标不是创建自己的视频视图,而是扩展可用的视频视图。

我不能为特定的视频视图开发人员的推理辩护,但是如果您正在开发一个API,并确定由某些数据表示的状态需要始终遵循某些规则,以保持对象的完整性和预期目的,然后将成员变量设置为私有,以便您可以控制其修改

它确实限制了其他开发人员的能力,但我想这就是重点。如果要更改某些内容,您可能希望在对API进行管理的小组中进行讨论和验证。在这种情况下,私有化是有意义的,这样对私有化的修改就不会超出集团的监管范围

我不知道是否有一个静态的经验法则来确定什么时候需要属于这一类,但我可以肯定地看到在某些情况下它的用途。

在这种情况下,我通常更喜欢继承,而不是继承

编辑:
当子类和超类都由同一个程序员控制时,使用继承是安全的,但实现继承可能导致脆弱的API。正如您所提到的,若超类实现发生了变化,那个么子类可能会崩溃,或者更糟糕的是,它会默默地做一些意想不到的事情


另一种方法是使用私有字段引用现有类(VideoView)的实例(称为composition),新类中的每个实例方法调用现有类的包含实例上的相应方法并返回结果。这种包装器方法也可以称为“装饰器”模式

当程序员将某些东西设置为私有时,他们打赌没有其他人需要使用或覆盖它,因此信息隐藏会带来回报。有时候,这种打赌不会成功。当我阅读了所有有启发性的答案(和评论)并向那些人发表评论时,我意识到我期望一些与某些课程无关的东西。在VideoView fr示例中,该类已经是继承链中的最后一个类。它不应该被扩展,因为它是一个逻辑单元,非常具体,非常紧凑,用于非常特定的目的。我的需要,从视图和MediaPlayer获得特殊状态,是出于质量控制目的的需要,在提供一个封闭单元的产品(尽管源代码是开放的)时,不应该考虑这些需要。这是一个合理的论点,我感到满意。有时并非每个OOP概念都应该实现。谢谢大家的回答。

我同意你的说法,我认为设计这样一个类,你完全失去了从中继承的可能性,这是OOP的主要概念之一,也是有原因的。如果我在子类中进行的更改违反了类的完整性,这是我的责任,并且只影响我/我的客户。@MByD-如果您正在编写API,那么您可以为继承设计类,如-SurfaceView,它可以扩展,但VideovView是一个小部件实现,因此保护变量以保持行为完整是很好的。。对于像我们这样的最终用户,我们可能希望创建SurfaceView的实现。您肯定会这样做(尽管您可以通过提供彻底的访问器方法来减轻它)。但这实际上取决于那些负责管理代码的人。他们需要做出决定,在没有得到他们的同意的情况下,他们不希望其他开发人员(或使用他们的API)去处理某些事情。。在这样的开源项目中,他们很可能希望让普通的API更新签入者不受影响。如果是这样的私人设置,只有拥有顶级访问权限的架构师才能做出更改的决定。这样一来,签入就不会让每个使用API的人都搞砸了。另请参见@Falcon,这就是我认为你的意思。在这种情况下,这种模式与我无关。@trashgood-我真的很喜欢你的链接posted@MByD-我觉得你应该找这个或它的变体。。关于VideoView,我觉得他们做了正确的事情:)+1也看到了。第16项:“优先于继承”和第17项:“为继承而设计和记录,否则禁止继承”详细阐述了这一艰难的权衡。