Какую выгоду обеспечивают локальные для метода внутренние классы в Java?
Я только что прочитал главу о локальных методах внутренних классов в книге SCJP, и я действительно изо всех сил пытаюсь придумать какое-либо практическое применение для них.
У меня всегда было впечатление, что методы должны быть настолько малы и конкретны для их задачи, насколько это возможно ( Orthogonality IIRC), поэтому введение даже самого простого внутреннего класса создало бы громоздкие и громоздкие методы.
Кто-нибудь может предложить хорошее практическое использование для локальных внутренних методов метода? Пока что мне кажется, что я должен понимать их исключительно для сдачи экзамена, а не для использования в повседневном программировании.
ура
6 ответов
В большинстве случаев (например, для слушателей действий, runnables и т. Д.) Вы бы использовали анонимные классы вместо именованных классов локальных методов.
Но есть одна вещь, которую могут делать именованные классы, а анонимные классы не могут: реализовать более одного интерфейса или расширить класс и интерфейсы. Также вы можете создать более одного объекта этого класса (без использования цикла).
Локальные внутренние классы методов полезны, когда вы пытаетесь выполнять "функциональные" операции или передавать код другому объекту, который будет вызван позже. В большинстве случаев такие классы вызываются или используются только один раз, поэтому нет необходимости определять их где-то еще и заставлять читателя искать его. Будущие версии Java, скорее всего, заменят большинство вариантов использования для этих типов внутренних классов "замыканиями".
Распространенными случаями являются случаи, когда вы пишете прослушиватель событий, который вызывает какой-то другой метод, или запускаете новый поток.
Local classes allows to take logic out of the parent class and objectify it. Это удаляет функциональность там, где она не принадлежит, и помещает ее в свой собственный класс. Но что, если этот новый объект нужен только на короткое время, только на время одного блока кода? Ну, вот где местный класс вписывается.
Локальные классы (метод локальных внутренних классов) используются редко. Это может быть полезно, когда внутри метода требуется какая-либо повторяющаяся функциональность, и если мы НЕ заинтересованы в создании метода уровня класса (например, из-за того, что эта функциональность нам может не потребоваться вне метода), допустим, что методы sum & mul неоднократно требуются в нашем коде (любом конкретном методе), один способ создать методы уровня класса и вызывать их всякий раз, когда это необходимо, но что, если эти методы больше не требуются вне этого метода, в этом случае мы можем подумать о создании локального внутреннего класса и доступ к его метод суммы, когда требуется только в этом методе, ниже пример
class Outer {
public void calculations() {
class Inner {
public int sum(int x, int y) {
System.out.println("sum : " + (x+y));
return x+y;
}
public int mul(int x, int y) {
System.out.println("multiplication : " + (x*y));
return x*y;
}
}
Inner i= new Inner();
//some code...
i.sum(10, 20);
//some code...etc
i.mul(30, 40);
i.mul(14, 12);
i.sum(10000, 20000);
//some other code...
}
}
public class TestClass {
public static void main(String[] args) {
new Outer().calculations();
}
}
Я думаю о Runnable
реализация передана в Thread:
Thread t = new Thread(new Runnable() {
void run() {
...
}
});
Это анонимный класс, и любой анонимный класс также является внутренним.