Бесполезное переопределение: просто нонсенс / запах кода или еще больше зла?

Мы только что нашли следующие строки кода Java,

@Override
public String toString() {
  return super.toString();
}

и начал размышлять. Это просто скучный бессмысленный запах кода или даже штраф за время выполнения?

6 ответов

Решение

Совершенно бесполезно, так как супер метод будет вызываться в любом случае.

Нарушение производительности во время выполнения для выполнения 2 вызовов метода вместо одного (1 бесполезный).

Существует законное использование, когда вы изменяете видимость переопределенного метода. Это очень полезно, когда вы тестируете свой старый код. Тем не менее, PMD/ сонар отмечает эту ситуацию как бесполезное переопределение тоже.

@Override
public Foo bar() {
    super.bar(); // super.bar() is a protected method
}

Поскольку вы не можете уменьшить видимость метода, в вашем конкретном случае он не имеет цели.

Этот код, скорее всего, генерируется шаблоном или генератором кода с намерением изменить реализацию по умолчанию. Генераторы кода могли бы быть более разумными, чтобы заполнить метод.

Я не думаю, что это приведет к существенному снижению производительности. Метод уже есть, это просто дополнительный вызов. И только когда toString нужно назвать - что само по себе не очень распространенный случай.

Ну, это может быть полезно в некоторых обстоятельствах, особенно когда вы используете язык с предварительной обработкой, такой как Objective-C, или для тестирования, например:

- (NSString *)description // Objective-C equlivent of Java toString()
{
#ifdef DEBUG
    NSString *desc = [super description];
    // Include lots of debug information here.
    return desc;
#else
    // Since this code is for release, end users do not want to see debug information
    return [super description];
#endif
}

В Java вы можете использовать некоторые комментарии - закомментировать отладочный код перед выпуском, вызывая это.

Переопределение

Методы toString() в классе java.lang.Object

полезно, когда вы хотите напечатать значимое сообщение при регистрации объектов Java. Возможно, пользователи могут использовать результирующую строку в качестве входной строки для некоторых других операций. Но

здесь он вызывает super.toString () и не имеет смысла

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

У меня есть это в PHP - это не бесполезно, оно меняет значение по умолчанию $c.

public function foo($a, $b, $c = false)
{// this is here to change the default value of $c
  parent::foo($a, $b, $c); // NOT useless - ignore the code sniffer
}

Обошел обход сниффера, заменив финал $c с $c ? $c : $c, Теперь это бесполезный кусок кода!

Другие вопросы по тегам