Подтвердить что ты не робот

Каковы цели внутренних классов

Я рассматриваю понятие внутренних классов в java. пока я не понял и не применил внутренние классы Java, имеет ссылку или доступ к методам и полям своего внешнего/охватывающего класса.

Мой вопрос:

  • Когда следует создавать или определять внутренний класс?
  • - внутренние классы, которые считаются "вспомогательными классами"?
  • Каковы показатели для вас, чтобы сделать внутренний класс и какова их другая цель?
4b9b3361

Ответ 1

Внутренние классы лучше всего подходят для логической группировки классов, которые используются в одном месте. Например, если вы хотите создать класс, который используется ТОЛЬКО включающим классом, то не имеет смысла создавать отдельный файл для этого. Вместо этого вы можете добавить его как "внутренний класс"

Согласно учебнику Java:

Необоснованные причины использования вложенных классов:

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

Ответ 2

Классическое использование для внутреннего класса - это реализация итератора внутри контейнера (ArrayList, например - искать class Itr). Весь контейнер, который хочет разоблачить остальную часть мира, - это Iterator. Однако он должен создать конкретную реализацию этого итератора, возможно, знакомого с внутренними элементами контейнера. Использование внутреннего класса скрывает реализацию, сохраняя ее близко к реализации контейнера. И будучи внутренним (то есть нестатическим), он привязан к конкретному экземпляру этого контейнера, который позволяет ему обращаться к частным членам контейнера.

Есть несколько типов внутренних классов - нестатический вложенный класс, локальные классы и анонимные классы. Каждый из них имеет несколько другую цель, поэтому, спрашивая о внутреннем классе, вы должны указать, о каком типе вы говорите.

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

Ответ 3

  1. Смотрите руководство по Java по основным причинам.

  2. Если под "классом помощника" вы подразумеваете что-то только для внутреннего использования, то нет, не обязательно. Вы можете сделать что-то вроде

    class Outer {
        private static class Inner implements InterestingInterface {
            // whatever
        }
        public InterestingInterface make_something_interesting() {
            return new Inner();
        }
    }
    

    Здесь Inner не является "вспомогательным классом" в том смысле, что внешний мир действительно может видеть его экземпляры, но его реализация полностью скрыта - внешний мир знает только, что получает некоторый объект, который реализует InterestingInterface.

Ответ 4

Одной из целей внутренних классов является присоединение слушателей. Например, предположим, у вас есть JMenuItem. Вы можете заставить его выйти из приложения, как показано в этом коде:

JMenuItem quitItem = new JMenuItem("Quit");
quitItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    {
        //cleanup code before exiting
        System.exit(0);
    }
});

Вы также можете захотеть, чтобы класс имел доступ к переменным состояния внешнего класса, которые полностью подчинены этому классу. Например, рассмотрим написание простого цветового калькулятора. Он может иметь текстовую область, в которую вы вводите шестнадцатеричный код. Когда вы нажимаете Enter, вы хотите, чтобы JPanel отображал цвет. Вот грубая схема того, что вы могли бы сделать.

public class ColorCalc extends JPanel implements Runnable
{
    Color displayedColor;
    JTextArea colorEnterArea;
    public ColorCalc()
    {
        displayedColor = Color.white
        colorEnterArea = new JTextArea();
    }
    public void run()
    {
        //build GUI here
    }
    public static void main(String[] args)
    {
         ColorCalc cc = new ColorCalc();
         javax.swing.SwingUtilities.invokeLater(cc);
    }
    //subservient inner class with access to outer class state variable.
    class ColorPanel extends JPanel
    {
         public void paintComponent(Graphics g)
         {
             g.setColor(displayedColor);
             g.fillRect(0,0,getWidth(), getHeight());
         } 
    }

}

Ответ 5

Как правило, объекты должны быть спроектированы под одну ответственность (очень сплоченные). Другими словами, любой объект, спроектированный хорошо, должен выполнять единую согласованную задачу. Это будет считаться наилучшей практикой для объектно-ориентированного проектирования.

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

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

Как показано выше в ncmathsadist, примером использования внутреннего класса может служить реализация обработчиков событий.

Например, при разработке графического интерфейса пользователя (GUI) разработчик мог создать кнопку, которая выполняет определенную задачу после того, как пользователь нажимает ее.

Для кнопки потребуется обработчик событий, который прослушивает нажатие этой конкретной кнопки.

В этом случае создание обработчика события для кнопки в качестве внутреннего класса было бы наилучшей практикой, поскольку внутренний класс не будет использоваться где-либо еще, кроме как с определенной кнопкой в классе GUI.

Ответ 6

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

Здесь внутренний класс скрыт от внешнего мира. Внутренний класс может получить доступ к частному члену охватывающего класса, который предоставляет нам инкапсуляцию.

Позвольте мне привести пример.. Предположим, вы хотите, чтобы механизм переключился на велосипед, и у вас есть бизнес-правило, так как есть только до 6 передач. Таким образом, вы можете создать цикл внутреннего класса, который будет иметь метод установки снаряжения. Этот метод имеет некоторую проверку, которая проверяется перед установкой передачи. Как только цикл работает... номер шестерни меньше 6...

Лучший пример - код обработки событий использует внутренние классы (иногда анонимные внутренние классы) для создания событий и прослушивателей без создания отдельных классов Event Object и Event Listener для вашего события.

Ответ 7

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

Ответ 8

Внутренний класс, используемый для группировки логики классов, например, если у вас есть класс B, и этот класс используется только в классе A, поэтому лучше поместить класс B в качестве внутреннего класса в классе A, так как это даст удобочитаемость и возможность повторного использования для ваш код.

Счастливый код :)

Ответ 9

Я бы просто подумал, что это всего лишь особенность языка. Я бы не рекомендовал использовать его, если мы примем OOD и повинуемся принципу SOLID.