Анонимный внутренний класс Comparable в методе Java?

Мой профессор предложил этот фрагмент кода в упражнении о масштабах и сроке службы:

class AnonymousInnerClassInMethod {

    public static void main(String[] args) {
        int local = 1;
        Comparable compare = new Comparable () {
            public int compareTo(Object value) {
                return (Integer)value - local;
            }
        };
        System.out.println(compare.compareTo(5));
    }

}

Если оставить в стороне тот факт, что local недоступен (это упражнение) и что Comparable не параметризован (недосмотр?) ... Я никогда не видел эту конструкцию и понятия не имел, что это вообще возможно.

  1. Сделано ли это таким образом, чтобы избежать расширения Comparable на весь класс?
  2. Если да, то почему? Это намного проще / читабельнее / что-то еще?
  3. Можно ли написать анонимный класс этого типа для любого интерфейса?

person MayNotBe    schedule 02.04.2014    source источник
comment
@ user3301492: Да, это так   -  person Engineer2021    schedule 02.04.2014


Ответы (2)


Он позволяет вам использовать класс и переопределять метод в конкретном случае, когда использование изолировано и / или зависит от доступа к локальным переменным.

Легче это или нет, зависит от личного вкуса. Однако это означает, что в вашем коде все находится на месте, что позволяет вам понимать, что происходит, без необходимости переходить к другому файлу или другому месту в вашем файле. В простых случаях, подобных приведенному выше, с этим, как правило, легче работать, чем прыгать по базе кода.

Чтобы local был доступен, его нужно объявить final.

Чтобы конкретно ответить на ваши вопросы:

  1. Нет; он анонимно расширяет другой класс, что эквивалентно определению класса, расширяющего другой, поэтому применяются те же правила. Вы должны переопределить любые абстрактные методы.
  2. Он более читабелен, потому что находится в том же месте, что и код, который этого требует.
  3. Да, любой интерфейс или класс.
person Charles Goodwin    schedule 02.04.2014

  1. Это определенно повлияет на область видимости с точки зрения того, доступен ли класс сравнения за пределами вашего основного метода.
  2. Повышенная способность к записи. ИМХО, за счет читабельности. Да, сейчас это выглядит просто, но попробуйте прочитать класс, в котором их много. Опять же, вопрос мнения. Обычно мы начинаем с анонимного или локального класса, а затем продвигаем его по мере уменьшения читабельности. Однако он отлично подходит для простых обратных вызовов. Документы Oracle содержат хорошее утверждение: «Используйте их, если вам нужно использовать локальный класс только один раз». Oracle Docs
  3. да. Таким образом можно использовать любой интерфейс или абстрактный класс.
person babernathy    schedule 02.04.2014