Философия Java


Внутренние классы в методе и контексте


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

  1. Как было показано предварительно, Вы реализуете интерфейс какого-то типа, так что Вы можете создать и вернуть ссылку.
  2. Вы решаете какую-то проблему и хотите создать класс, который эту проблему исправляет, но Вы не хотите, что бы этот класс был доступен для кого-то еще.

В следующих примерах, предыдущий код будет изменен для получения следующих "результатов":

  1. Класс определен в методе
  2. Класс определен в контексте внутри метода
  3. Анонимный класс реализует интерфейс
  4. Анонимный класс расширяет класс, который имеет конструктор не по умолчанию
  5. Анонимный класс, осуществляющий инициализацию полей
  6. Анонимный класс, который осуществляет создание, используя инициализацию экземпляра (анонимный внутренний класс не может быть с конструктором)

Хотя это и обычный класс с реализацией, но Wrapping так же используется и в качестве общего интерфейса к его производным классам:

//: c08:Wrapping.java

public class Wrapping { private int i; public Wrapping(int x) { i = x; } public int value() { return i; } } ///:~

Вы должны знать, что у Wrapping есть конструктор, требующий аргумента. Это сделано для того, что бы было немножко поинтереснее.

В первом примере показывается создание целого класса внутри контекста метода (вместо контекста другого класса):

//: c08:Parcel4.java

// Вложенность класса внутри метода.

public class Parcel4 { public Destination dest(String s) { class PDestination implements Destination { private String label; private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new PDestination(s); } public static void main(String[] args) { Parcel4 p = new Parcel4(); Destination d = p.dest("Tanzania"); } } ///:~




Начало  Назад  Вперед