我用 扫描仪课 用于读取多个类似的文件。我想扩展它以确保他们都使用相同的 定界符 我也可以添加类似的方法 skipuntilyoufind(字符串) 这对他们所有人都有效。

我可以制作一个包含它们的实用类别,或将扫描仪类嵌入另一个类中的变量,但这更麻烦。

我已经找到 一些原因 要声明最终的课程,但是为什么在这里完成?

有帮助吗?

解决方案

可能是因为将其扩展并覆盖某些方法可能会破坏它。并使覆盖方法更容易暴露在许多内部工作中,因此,如果他们将来决定更改这些方法(出于表现或其他原因),那么他们很难更改课程而无需打破所有类别扩展了它。

例如,考虑类中的以下方法:

public boolean nextBoolean()  {
    clearCaches();
    return Boolean.parseBoolean(next(boolPattern()));
}

假设您想覆盖这一点,因为您想使“真棒”评估为“真”布尔值(无论出于何种原因)。如果覆盖它,则不能调用super.nextboolean(),因为那将使用默认逻辑消耗下一步的令牌。但是,如果您不调用super.nextboolean(),则不会调用clearcaches(),可能会破坏其他未覆盖的方法。您不能致电clearcaches(),因为它是私人的。如果他们受到保护,但随后意识到它会导致性能问题,并且想要一个不再清除缓存的新实现,那么他们可能会破坏您的覆盖实现,这仍然可以称为这一点。

因此,基本上是这样,因此他们可以轻松地更改同类中的隐藏部分,这些零件非常复杂,并保护您免受破碎的儿童课(或可以轻松破坏的班级)。

其他提示

我想这是由于安全原因。此类读取用户输入,以便有人可以扩展其行为,并且会被搞砸。如果是最终的,那么对坏人来说并不容易,因为如果他制作自己的扫描仪(不是java.util.scanner),那么多态性的原理就会被打破。看到坏人可以足够聪明,可以编写一个机器人/脚本,该机器人/脚本在远程服务器上自动执行此操作……他甚至可以通过在编译应用程序中的动态class Loading来完成此操作。

我认为您提供的链接可以解释这一切。

就您而言,似乎您应该喜欢构图而不是继承。您正在创建具有一些预定义行为的实用程序,并且可以隐藏扫描仪类的一些(或全部)详细信息。

我已经看到许多使用继承来改变行为的实现。最终结果通常是一种整体设计,在某些情况下是合同断裂和/或行为破裂。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top