Подтвердить что ты не робот

Преимущество локальных классов Java

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

4b9b3361

Ответ 1

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

Ответ 2

Вот пример того, как анонимный внутренний класс, локальный внутренний класс и обычный внутренний класс могут присутствовать в программе. В этом примере рассматривается метод 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 в методе, в котором они объявлены, и в то же время классы локально к самому методу, поэтому к нему нельзя получить доступ из внешних классов и других методов в пределах одного класса.

Ответ 3

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

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

С другой стороны, они делают несколько отвратительно подробный синтаксис даже более беспорядочным.