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

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

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

Вот пример того, как анонимный внутренний class, локальный внутренний class и обычный внутренний class могут присутствовать в программе. В примере рассматривается метод InnerClass class InnerClass присутствующий в classе MyClass . Для обсуждения эти classы будут реализовывать интерфейс 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() {} } } 

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

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

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

Локальный внутренний class может быть использован для создания classа, который находится в локальной области – он не сможет быть доступен из других методов вне 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(); } 

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

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

Другое дело об анонимном внутреннем classе и локальном внутреннем classе заключается в том, что он сможет получить доступ к 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 } } // ... // 

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

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

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

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

  • адаптер - Любой реальный пример шаблона адаптера
  • Нельзя наследовать от std :: vector
  • Почему частные поля являются приватными для типа, а не экземпляра?
  • Неужели плохая практика заставит сеттера вернуть «это»?
  • Полиморфизм - определение только двух предложений
  • В чем разница между экземпляром и объектом?
  • Как я должен объяснить разницу между интерфейсом и абстрактным classом?
  • Перечисления Java: два типа перечислений, каждый из которых содержит ссылки друг на друга?
  • вызывающие сеттеры от конструктора
  • Интерфейс против абстрактного classа (общий OO)
  • Блокировка доступа к частным переменным-членам? Принудительное использование публичных объектов?
  • Давайте будем гением компьютера.