Вопрос

Я использую Сканер класса Для чтения нескольких подобных файлов. Я хотел бы продлить его, чтобы убедиться, что все они используют то же самое делимитр И я также могу добавить методы, как Skipuntilyoufind (Thire Explere) что все действительно для них все.

Я могу сделать класс утилиты, который содержит их, либо встроить класс сканера в виде переменной внутри другого класса, но это более громоздки.

я нашел некоторые причины объявить финал класса, но почему это здесь сделано?

Это было полезно?

Решение

Вероятно, потому что расширение его и перезаписи некоторые из него методов, вероятно, сломают бы его. И облегчил перезаписи методы раскрыть большую часть внутренних работ, поэтому, если в будущем они решают изменить их (для выполнения или по некоторым другим причинам), им было бы сложнее изменить класс, не нарушая все классы. которые расширяют это.

Например, рассмотрим следующий метод в классе:

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

Скажем, вы хотите перезаписать это, потому что вы хотите сделать «потрясающе», оценивающую на «истинную» логию (по какой-либо причине). Если вы перезаписываете его, вы не можете позвонить Super.NextBoolean (), поскольку это будет потреблять следующий токен, используя логику по умолчанию. Но если вы не звоните Super.nextBoolean (), ClearCaches () не будут вызваны, возможно, нарушая другие не перезаписанные методы. Вы не можете назвать ClearCaches (), потому что это частное. Если они сделали его защищенным, но потом поняли, что это вызывает проблему с производительностью, и требует новой реализации, которая больше не очищает кэширует, тогда они могут нарушить вашу перезаписанную реализацию, которая все равно позвонит на это.

Таким образом, в основном это так, чтобы они могли легко изменить скрытые части внутри класса, которые довольно сложны и защищают вас от создания сломанного детского класса (или класса, который может быть легко сломан).

Другие советы

Я полагаю, это связано с соображениями безопасности. Этот класс читает ввод пользователя, так что кто-то с плохими намерениями может продлить его, изменить его поведение, и вы будете облагаться. Если это финал, не так просто для плохого парня, потому что, если он делает свой тип сканера (не Java.util.scanner), принципы полиморфизма будут нарушены. Посмотрите, как плохой парень может быть достаточно умным, чтобы написать бот / сценарий, который делает это автоматически на удаленных серверах ... он может даже сделать это путем динамической классификации в скомпилированном приложении.

Я думаю, что ссылка, которую вы предоставили, объясняет все это.

В вашем случае кажется, что вы должны предпочесть композицию вместо наследования в любом случае. Вы создаете утилиту, которая имеет некоторое предварительно определенное поведение, и это может скрыть некоторые (или все) деталей класса сканера.

Я видел много реализаций, которые использовали наследство, чтобы изменить поведение. Конечный результат был обычно монолитным дизайном, а в некоторых случаях сломанный договор и / или сломанное поведение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top