В чем преимущество локальных классов на Java или на любом другом языке, который использует эту функцию?
Преимущество локальных классов Java
Ответ 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
Есть несколько вещей, которые вы можете сделать с локальными классами, которые вы не получаете с анонимными внутренними классами.
- потому что тип имеет имя, вы можете более удобно добавлять элементы не в супертип
- данное имя может облегчить отслеживание трассировки стека (особенно для объектов блокировки).
- подтип более одного базового типа
- построить более чем в одном месте и несколько конструкторов
С другой стороны, они делают несколько отвратительно подробный синтаксис даже более беспорядочным.