Java 8Вызов виртуального метода от конструктора
Я был немного озадачен тем, что мы не могли вызвать виртуальный метод из конструктора. Ловушка заключается в том, что мы можем перегружать ее и рушиться. Но что, если мы назовем это из конструктора final класс. Например:
public final class MyClass implements MyInterface {
private final Object[] arr;
public MyClass(){
Object[] arr;
//init arr
this.arr = arr;
//Now we have to preprocess it
preprocess();
}
@Override
public void preprocess(){
//impl
}
public int count(){
//impl
}
}
public interface MyInterface{
void preprocess();
int count();
}
Есть ли другие подводные камни с вызовами виртуальных методов внутри конструктора? Конечно, я могу извлечь препроцесс в статический метод, а затем вызвать его из обоих, но он выглядит немного грязным. Я хотел бы сохранить код максимально чистым.
Как последний класс представляет собой ловушку? Это просто означает, что вы не можете расширить этот класс ... Вам все еще нужно реализовать методы интерфейсов, поэтому вызов их в конструкторе не имеет ничего общего с окончательным классом –
@ cricket_007 Нет, похоже, вы не понимаете. Дж. Блох в своей эффективной Java написал, что мы не должны вызывать неконкретный метод из конструктора. Если мы это сделаем, мы рискуем ввести ошибку. – user3663882
@ cricket_007 спасибо, исправлено. – user3663882