【问题标题】:Java class containing only private members仅包含私有成员的 Java 类
【发布时间】:2011-08-11 20:53:33
【问题描述】:

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

不幸的是(对我而言),VideoView 类的所有成员都是私有的,因此即使扩展该类也无法帮助我访问其 MediaPlayer 对象(或其他任何东西),我必须完全复制与我的修改类。

好吧,虽然听起来我在抱怨“辛勤工作”,但在这种情况下,它比扩展课程更容易(因为所有资源都可用......),但这让我真的怀疑这一点信息隐藏方法。 这比让主要组件可供修改/访问(受保护,不公开)更好吗?我的意思是,我知道如果我扩展 VideoView 类,有一天他们可能会改变VideoView 类和我可能会遇到麻烦,但如果他们改变类,我自己的(重复)版本将与 VideoView 类有更大的不同,我的目标不是创建自己的视频视图,而是扩展可用的 VideoView。

【问题讨论】:

    标签: java oop encapsulation information-hiding


    【解决方案1】:

    我不能代表特定 VideoView 开发人员的推理,但如果您正在开发 API,并确定某些数据所代表的状态需要始终按顺序遵循某些规则为了保持对象的完整性和预期用途,将成员 var 设为私有是有意义的,这样您就可以控制它们的修改。

    它确实限制了其他开发人员可以做的事情,但我认为这就是重点。如果要更改某些内容,您会希望它在对 API 进行治理的小组中进行讨论和验证。在这种情况下,私有化是有意义的,这样对它的修改就不会在集团的监督之外失控。

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

    【讨论】:

    • 我同意你所说的,我认为通过设计这样一个类,你完全失去了继承它的可能性,这是 OOP 的主要概念之一,也是有原因的。如果我在子类中做出违反类完整性的更改,这是我的责任,并且只影响我/我的客户。
    • @MByD - 如果您正在编写 API,那么您可以设计继承类,例如 - SurfaceView ,它可以扩展,但 VideovView 是一个小部件实现,因此最好保护变量以保持行为完好无损.. 对于像我们这样的最终用户,可能会创建 SurfaceView 的实现。
    • 你肯定会这样做(尽管你可以通过提供彻底的访问器方法来减轻它)。但这真的取决于负责管理代码的人。他们可以做出决定,他们不希望他们下的其他开发人员(或使用他们的 API)在未经他们同意的情况下搞砸。
    • 另外需要指出的是.. 在这样的开源项目中,他们可能希望让普通人在检查 API 更新时不会弄乱这个。如果它是这样私下设置的,则只有具有最高访问权限的架构师才能决定更改它。这样一来,每个使用 API 的人都无法进行签入。
    【解决方案2】:

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

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

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

    【讨论】:

    • @Falcon-这就是我以为你的意思。在这种情况下,这种模式与我无关。
    • @trashgod - 我真的很喜欢你发布的链接
    • @MByD - 我觉得你应该寻找这个或这个的一些变体......关于 VideoView - 我觉得他们做了正确的事情:)
    【解决方案3】:

    当程序员将某些东西设为私有时,他们是在打赌,没有其他人需要使用或覆盖它,因此信息隐藏会带来回报。有时这个赌注不会成功。他们是休息时间。

    【讨论】:

    • +1 另见Bloch。第 16 条:“优先组合优于继承”和第 17 条:“为继承设计和记录或禁止它”详细阐述了这种艰难的权衡。
    【解决方案4】:

    当我阅读所有有启发性的答案(和 cmets)并对其发表评论时,我意识到我期待的东西与某些课程无关。以 VideoView fr 为例,这个类已经是继承链中的最后一个。它不应该被扩展,因为它是一个逻辑单元,非常具体和非常紧凑,用于非常具体的目的。我需要从视图和 MediaPlayer 中获取特殊状态,这是出于 QC 目的的需要,而在提供封闭单元的产品时(尽管源是开放的),确实不应该考虑这种需求。这是一个合理的论点,我觉得它令人满意。有时并非每个 OOP 的概念都应该实现。谢谢大家的回复。

    【讨论】:

    • +1 我想你会喜欢Bloch 的第 4 章。
    猜你喜欢
    • 2011-02-24
    • 2017-12-22
    • 2013-10-10
    • 1970-01-01
    • 2011-08-23
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多