Странный код Java: класс в классе - PullRequest
0 голосов
/ 16 апреля 2010

В некоторых примерах кодов есть методы и классы, объявленные в других методах и / или классах.

Я никогда не слышал / не читал об этом. Какой эффект имеет этот вид программирования? Разве не было бы лучше записывать классы в отдельном файле и методах бок о бок, а не друг в друге (как говорит каждая книга)? Каковы преимущества и недостатки этого вида программирования?

Вот пример того, что я имею в виду:

Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        TextView textView = (TextView) findViewById(R.id.description);
        textView.setText(mRoad.mName + " " + mRoad.mDescription);
        MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
        List<Overlay> listOfOverlays = mapView.getOverlays();
        listOfOverlays.clear();
        listOfOverlays.add(mapOverlay);
        mapView.invalidate();
    }
};

Ответы [ 7 ]

6 голосов
/ 16 апреля 2010

Существует два типа классов, которые могут быть в классе: внутренние классы и анонимные классы.

Оба в основном используются для создания классов, которые не работают в одиночку, но нуждаются в доступе к окружающему объекту. Эти классы имеют полный доступ ко всему окружающему объекту (исключение: определение статического внутреннего класса).

4 голосов
/ 16 апреля 2010

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

Эта страница содержит больше информации об анонимных внутренних классах.

2 голосов
/ 16 апреля 2010

Анонимные классы распространены при определении небольшой реализации интерфейса, с которым вы работаете, такого как EventListeners. Следует отметить, что вы НЕ будете иметь доступа к локальным переменным (и параметрам), если они не объявлены как окончательные.

2 голосов
/ 16 апреля 2010

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

1 голос
/ 16 апреля 2010

Одним из примеров общего использования является реализация Listener:

class myPanel extends JPanel {
    public MyPanel() {
        JButton b1 = new JButton("Hello");
        b1.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    // do something for button b1
                }
            }
        );
    }
}

Теперь представьте, что реализация Listener может зависеть от некоторых свойств внешнего класса (myPanel). Использование анонимного класса Вы можете легко это сделать.

1 голос
/ 16 апреля 2010

Преимущество внутренних классов также заключается в возможности ссылаться на класс контейнера без явного указателя.

Быть анонимным - это просто лаконичность.

1 голос
/ 16 апреля 2010

Да, это называется: анонимный класс.

Подробнее об этом можно прочитать здесь: http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...