Бесполезное переопределение: просто нонсенс / запах кода или еще больше зла?
Мы только что нашли следующие строки кода 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
, Теперь это бесполезный кусок кода!