1. Java / Говнокод #5633

    +71

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    class CellEditor {
    
       protected CellEditor(Composite parent, int style) {
    	this.style = style;
    	create(parent);
       }
    
       public void create(Composite parent) { ... }
    
    }

    А вот это уже JFace...
    5 строка подарил много положительных эмоций, при попытке сконструировать кастомный CellEditor

    Запостил: tir, 11 Февраля 2011

    Комментарии (17) RSS

    • ммм, те кто минусуют аргументировали бы

      P. S. Для большей очевидности можно слово abstract добавить в 1-й строке
      Ответить
      • минусы символизируют, что код - говно. Ты разве не знал?
        Ответить
        • то же самое для комментариев справедливо ;)
          Ответить
    • комментарии минусуют когда код говно?
      кэп, а в чем говно-то?
      Ответить
    • Где здесь Капитан?
      Ответить
    • Пацаны, шухер! ЭТО ПОСТ ЗЛА!!!111
      Ответить
    • Ок. Объясняю. Перегрузка метода, вызываемого из конструктора - зло, причем великое. Почему - читайте Джошуа Блоха "Java. Эффективное программирование" (Joshua Bloch "Effective Java"). Если кто-то из java кодеров ее еще не читал - срочно качайте и читайте. Так сказать книга must read. Кому лень читать, попробую . объяснить. Допустим у меня есть потомок, например MyCellEditor. Чтобы создать мой собственный редактор, мне надо перегрузить метод create. Допустим, что я хочу, чтобы это был комбобокс , а количесто элементов в списке зависело от передаваемого параметра. Я бы мог определить конструктор
      MyCellEditor(Composite parent, int style, int numberOfLines) {
      super(parent, style);
      this.numberOfLines = numberOfLines;
      }, ну и в методе create() соответственно написать код в стиле
      ...
      combo.setVisibleLinesCount(this.numberOf Lines)
      ...

      Да как говорится, не тут-то было. В момент когда я вызываю super(parent, style) вызывается перегруженный мною метод create(), и в данный момент переменная this.numberOfLines не определена (точнее равна нулю, т. к. это поле). И красивых способов исправить данную ситуацию нет.

      Вывод: НИКОГДА НЕ ПЕРЕГРУЖАЙТЕ МЕТОД ВЫЗЫВАЕМЫЙ ИЗ КОНСТРУКТОРА!!!
      Ответить
      • Всё так. Методы, вызываемые из конструктора должны быть final или private. Нормальные IDE недовольно ворчат по этому поводу.
        Ответить
        • угу. а в JFace'е приведенный пример - Public API и другого способа для создания cell editor'ов нет.
          Ответить
      • super(parent, style);
        this.numberOfLines = numberOfLines;

        а поменять местами не судьба?

        не раскрыта суть метода create(). Нахер его перегружать? Заведите свой .MyCreate() в наследнике.
        Ответить
        • в методе create надо реализовывать создание редактора, собсно в этом методе мне уже как бы и надо знать numberOfLines. create() - метод из public API, также как и сам класс CellEditor.
          Ответить
          • так чем не нравится в конструкторе поменять местами строчки?
            Ответить
            • в java нельзя ничего вставить до вызова super()
              Ответить
              • гыг, ацтой. не знал. Я Вообще-то на Delphi пишу обычно ))))
                Ответить
                • а еще, если явно super() не указан, ява считает, что он все равно там есть
                  Ответить
              • вы всё еще считаете, что нет ничего сранее, чем дельфи? тогда мы несем яву к вам!
                Ответить

    Добавить комментарий