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

    +76

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    public class ValueList< T > implements Cloneable
    {
        public ValueList() { }
    
        public void addValue( final T value ) {
            list.add( value );
        }
    
        @Override
        @SuppressWarnings( { "unchecked", "unchecked" } )
        public Object clone() throws CloneNotSupportedException {
            super.clone();
            ValueList< T > object = new ValueList< T >();
            List< T > objectList = object.getList();
            objectList = ( List< T > )list.clone();
            for( int index = 0; index < list.size() ; ++index ) {
                objectList.set( index, ( Object )list.get( index ).clone() );
            }
            return object;
        }
    
        public List< T > getList() {
            return list;
        }
    
        private ArrayList< T > list = new ArrayList< T >();
    }

    Человек из соседнего отдела порадовал...

    Запостил: SadKo, 20 Июня 2011

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

    • суперклонама
      Ответить
    • Да уж, в таком коде полюбому надо дважды warning'и супрессить. чтобы наверняка.
      Ответить
    • сигнатура вместе с "unchecked", "unchecked" радует
      Ответить
      • Порекомендовал ему помимо дефолтового конструктора сделать ещё и копирующий конструктор, который и вызывать в clone().
        Ответить
        • > копирующий конструктор
          мда
          Ответить
          • Что не так?
            Ответить
            • ну это же Java
              Ответить
              • И? Я не понял, в чём подколка.
                Ответить
                • Видимо, конструктор копирования в джаве называется просто конструктором.

                  А вообще вместо копирования объекта в джаве "копируется" ссылка.
                  Ответить
                  • да, это понятие с++, в жабе такого нет
                    Ответить
                    • То бишь, хотите сказать, что не существует конструкторов:
                      class T
                      {
                      public T(T source) { }
                      }

                      ?
                      Ответить
                      • нет, почему же, это обычный конструктор с параметром, и у него нет поддержки на уровне языка, как в С++
                        Ответить
                        • То, что в Java нет конструкции для неявного вызова такого конструктора - согласен. Но по сути функцию копирования он выполняет. В этом смысле он и является копирующим.
                          Ответить
                          • > Но по сути функцию копирования он выполняет
                            если тело конструктора корректное, да.
                            Ответить
                            • Ну да, это верно и для С++. Конструктор копирования вполне может не выполнять свою работу.) Впрочем, он по прежнему будет называться конструктором копирования...
                              Ответить
                      • Например:
                        void f(T a){
                        //...
                        T a1;
                        //...
                        f(a1);
                        В С++ конструктор копирования будет вызван в данном случае, а в джаве не будет, а просто в функцию будет передана ссылка на а1. В этом и есть поддержка конструктора копирования со стороны языка в С++.
                        Ответить
                        • Да это понятно и ежу.
                          Но функцию копирования объекта он выполняет - выполняет. Пусть у него и нет неявного вызова.
                          Ответить
                          • Я с вами не спорил и самого начало был согласен. Просто объяснил другую точку зрения.
                            Ответить
                    • Кстати, как в джаве обстоят дела с передачей константных объектов в функции? Есть что-то типа
                      void f(const T a)
                      ?
                      Ответить
                      • есть конструкция
                        void f(final T a)

                        но в ней не особо много смысла
                        Ответить
                        • То есть, защититься от порчи моего объекта чужой функцией никак нельзя? Печально, а ведь также и в C#... Неужели так сложно сделать константную ссылку... :(
                          Ответить
                          • в принципе правильное проектирование поможет, а вообще можно изголяться - например, отдавать клон.
                            Ответить
                            • Ну не всегда же это делать, медленно. Тем более не всегда нужно. Хотелось бы, что-бы "сама функция могла потребовать" ошибкой компиляции копию или сам объект.
                              Я несколько раз напарывался на порчу своего объекта во время выполнения. Просто забыл сделать его копию и не заметил этой ошибки, пока не запустил программу... В результате потратил лишних пол часа на ненужную отладку...
                              Ответить
                              • Проектирование в стиле immutable data часто помогает избежать проблем (разумеется он не всегда применим). Дизайн String, наследников Number и прочих BigInteger может служить примером. В функциональных языках это норма. К сожалению, он далеко не всегда применим.
                                Ответить
                        • смысл есть: вложенные классы блока могут использовать эти переменные, если они final. Это даже иногда используется, особенно в коде Sun-Oracle. Вы, разумеется, это знаете, но люди, не особо знакомые с Java, об этом могут не знать.
                          Ответить
                      • Есть final, но он запрещает изменение переменной, а не запрещает менять содержимое объекта.
                        Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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