Ответы пользователя по тегу ООП
  • Можно ли таким способом передавать аргументы в конструктор enum?

    EugeneP2
    @EugeneP2
    Java Dev
    Можно рассмотреть такой пример:
    public enum A {
        AAA {
            public void i() {
                System.out.println("Hi AAA");
            }
        },
    
        BBB {        
            public void j() {
                System.out.println("Hi BBB");
            }
        },
        CCC;
    
        public static void main(String[] args) {
            System.out.println(A.AAA.getClass().getName());
            System.out.println(A.BBB.getClass().getName());
            System.out.println(A.CCC.getClass().getName());
        }
    }


    Получаем:
    com.home.A$1 - анонимный класс
    com.home.A$2 - анонимный класс
    com.home.A

    т.е. создано 3 файла *.class

    В конечном итоге, сам класс А - финальный и его нельзя расширять, но чтоб enum-ы могли реализовывать абстрактные методы, интерфейсы и как в примере выше, можно предположить, что внутри JVM разрешено наследоваться от enum-а.

    UPD01:
    После декомпиляции класс "A$1.class" с помощью javadecompilers, получаем код, который подтверждает догадку насчет анонимных классов

    static final class A
    extends com.home.A {
        A(String string2, int n2) {
            super(string, n, null);
        }
    
        public void i() {
            System.out.println("Hi AAA");
        }
    }
    Ответ написан
    2 комментария
  • Одинаковые куски кода в разных классах допустимо или нубство?

    EugeneP2
    @EugeneP2
    Java Dev
    По поводу "switch (data.length)": тут нужно задействовать полиморфизм. Создать интерфейс с методом который принимает массив int[]data, и под каждый вариант case сделать соответствующую реализацию.

    Например
    interface Worker {
      void doWork(int[] data);
    }
    
    class Worker96 implements Worker  {
       public void doWork(int[] data) {
           ....
       }
    }
    
    class Worker71 implements Worker  {
       public void doWork(int[] data) {
           ....
       }
    }
    
    // потом можно создать мапу 
    
    class Main {
    
    private Map<Integer, Worker> workers = ....;
    
    Main (){
        workers.put(96, new Worker96());
        workers.put(71, new Worker71());
    }
    public void dataProcessing(int[] data) {
       Worker w = workers.get(data.length);
       if (w == null)
           throw new RuntimeException("Unsupported data length!");
    
       w.doWork(data);
    }
    }
    // как то так...


    По поводу первого случая, если код не предполагает хранение состояния,
    то можно вынести код в отдельный утильный класса в статический метод.
    Ответ написан
    4 комментария
  • Почему не стоит вызывать методы в конструкторе?

    EugeneP2
    @EugeneP2
    Java Dev
    Почему нельзя? очень даже можно, только этот метод должен быть private. Не рекомендуют вызывать public и protected методы. Если класс не финальный, открытые методы могут быть переопределены в подклассе, и тогда в вашем конструкторе будут вызываться не ваши методы, а переопределенные, что может сломать логику работы вашего класса и привести к ошибке.
    Ответ написан
    Комментировать
  • Getter,setter для чего нужны?

    EugeneP2
    @EugeneP2
    Java Dev
    Это одно из соглашений для класса, что бы он мог использоваться как Java Bean

    Свойства класса должны быть доступны через get, set и другие методы (так называемые методы доступа), которые должны подчиняться стандартному соглашению об именах. Это легко позволяет инструментам автоматически определять и обновлять содержание bean’ов.
    .

    + на данном соглашении работают куча различных сериализаторов xml/json, JPA

    + простые приставки к методам get и set сразу говорят для чего эти методы.

    З.Ы.
    По честному, ручное прописывание getter-ов и setter-ов давно всем надоело и избыточно, потому в современных JVM языках, типа Groovy или Scala методы доступа генерируются автоматически компилятором. Для Java есть фреймверк Lombok, он позволяет автоматически генерировать методы доступа к полям.
    Ответ написан
    Комментировать
  • Правильно ли я понял как работает вызов метода из ссылки типа родительского класса?

    EugeneP2
    @EugeneP2
    Java Dev
    Это определяет не компилятором, а в рантайме. Это называется динамическое связывание
    Ответ написан
    3 комментария
  • Где на практике и при каких задачах применяется проверка равнозначности объектов?

    EugeneP2
    @EugeneP2
    Java Dev
    В большинстве случаев метод equals + hashCode реализуются, чтоб объект класса корректно хранился в Map и Set коллекциях. Внутренняя реализация коллекций используется эти методы.
    Ответ написан
    Комментировать