Преимущество локальных классов Java - PullRequest
20 голосов
/ 26 января 2009

В чем преимущество локальных классов на Java или на любом другом языке, который использует эту функцию?

Ответы [ 3 ]

25 голосов
/ 26 января 2009

Вот пример того, как анонимный внутренний класс, локальный внутренний класс и обычный внутренний класс могут присутствовать в программе. В примере рассматривается метод myMethod и класс InnerClass, присутствующий в классе MyClass. Ради обсуждения все эти классы будут реализовывать интерфейс Runnable:

public class MyClass
{
    public void myMethod()
    {
        // Anonymous inner class        
        Runnable r = new Runnable() {
            public void run() {}
        };

        // Local inner class
        class LocalClass implements Runnable
        {
            public void run() {}
        }
    }

    // ... //

    // Inner class
    class InnerClass implements Runnable
    {
        public void run() {}
    }
}

Анонимный внутренний класс может быть использован для простого создания класса, который реализует Runnable без необходимости выписывать класс и называть его, и как krosenvold , упомянутый в его пост, он используется как «закрытие бедняка» в Java.

Например, очень очень простой способ запустить Thread с использованием анонимного внутреннего класса:

new Thread(new Runnable() {
    public void run()
    {
        // do stuff
    }
}).start();

Локальный внутренний класс может использоваться для создания класса, который находится в локальной области видимости - к нему нельзя будет получить доступ из других методов за пределами myMethod.

Если был другой метод и мы попытались создать экземпляр LocalClass, который находится внутри метода myMethod, мы не сможем сделать это:

public void anotherMethod()
{
    // LocalClass is out of scope, so it won't be found,
    // therefore can't instantiate.
    new Thread(new LocalClass()).start();
}

внутренний класс является частью класса, в котором находится внутренний класс. Так, например, внутренний класс InnerClass может быть доступен из других классов с помощью MyClass.InnerClass. Конечно, это также означает, что другой метод в MyClass может также создавать экземпляр внутреннего класса.

public void anotherMethod()
{
    // InnerClass is part of this MyClass. Perfectly instantiable.
    new Thread(new InnerClass()).start();
}

Еще одна вещь, связанная с анонимным внутренним классом и локальным внутренним классом, заключается в том, что он сможет получить доступ к final переменным, которые объявлены в myMethod:

public void myMethod()
{
    // Variable to access from anonymous and local inner classes.
    final int myNumber = 42;

    // Anonymous inner class        
    Runnable r = new Runnable() {
        public void run()
        {
            System.out.println(myNumber); // Works
        }
    };

    // Local inner class
    class LocalClass implements Runnable
    {
        public void run()
        {
            System.out.println(myNumber); // Works
        }
    }

    // ... //

Итак, каковы преимущества? Использование анонимных внутренних классов и локальных внутренних классов вместо отдельного полноценного внутреннего класса или класса позволит первым иметь доступ к final переменным в методе, в котором они объявлены, и в то же время классы локально для самого метода, поэтому к нему нельзя получить доступ извне классов и других методов в том же классе.

14 голосов
/ 26 января 2009

Есть несколько вещей, которые вы можете сделать с локальными классами, которые вы не получите с анонимными внутренними классами.

  • поскольку у типа есть имя, вы можете с большей пользой добавлять членов, не входящих в супертип
  • данное имя может упростить отслеживание стека (особенно для объектов блокировки)
  • подтип более чем одного базового типа
  • построить в более чем одном месте, и несколько конструкторов

С другой стороны, они делают какой-то ужасно подробный синтаксис еще более запутанным.

12 голосов
/ 26 января 2009

Они позволяют вам выводить логику из родительского класса и объективировать ее. Это удаляет функциональность там, где она не принадлежит, и помещает ее в свой собственный класс. Но что, если этот новый объект нужен только на короткое время, только на время одного блока кода? Вот где подходит местный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...