Философия Java

         

Что такое компонент (Bean)?


После того, как осядет пыль, компонент представляет собой блок кода, обычно, заключенного в класс. Ключевая способность построителя приложения состоит в обнаружении свойств и событий компонента. Для создания VB компонент программист должен написать довольно сложный кусок кода, следуя определенным соглашениям для выделения свойств и событий. Delphi был визуальным инструментом программирования второго поколения, и дизайн языка был построен исходя из простоты построения и использования визуальных компонент. Однако Java стал использовать создание визуальных компонент наиболее продвинутым способом с помощью JavaBeans, потому что компонент (Bean) - это просто класс. Вам не нужно писать дополнительный код или использовать специальное расширение языка для создания какого-нибудь компонента. Фактически, вам необходимо сделать только одну вещь: слегка модифицировать способ, которым вы создаете названия методов. То есть использовать имя метода, которое скажет построителю приложения, является ли он свойством, событием или просто обычным методом.

В документации по Java это соглашение об именах ошибочно называется “шаблон разработки (design pattern)”. Это не удачно, так как шаблоны разработки (смотрите Thinking in Patterns with Java, доступной на www.BruceEckel.com) и так оспариваются и без этой путаницы. Это не шаблоны разработки, это просто соглашение об именах и оно достаточно простое:

  • Для свойства с именем xxx вы обычно создаете два метода: getXxx( ) и setXxx( ). Обратите внимание, что первая буква после “get” или “set” автоматически преобразуется к нижнему регистру для получения имени свойства. Тип, производимый методом “get” должен быть тем же самым, что и тип аргумента в методе “set”. Имя свойcтва и тип для “get” и “set” не связаны.
  • Для свойства типа boolean вы можете использовать подход для “get” и “set”, описанный выше, но вы также можете использовать “is” вместо “get”.
  • Обычные методы компонента (Bean) не удовлетворяют соглашению об именах, но они публичные (public).

  • Для событий вы используете подход “слушателей” из Swing. Он точно такой же, как вы видели: addFooBarListener(FooBarListener) и removeFooBarListener(FooBarListener) для обработки FooBarEvent. Чаше всего для ваших нужд подойдут встроенные события и слушатели, но вы можете также создать свои собственные события и интерфейсы слушателей.


  • Пункт 1 отвечает на вопрос о том, что вы могли заметить, когда просматривали код в старом стиле и код в новом стиле: число имен методов стало меньше, и иметь явно осмысленный характер. Теперь вы видите, что большинство из этих изменений были сделаны для адаптации к соглашению об именах в отношении “get” и “set”, чтобы встроить определенный компонент в Bean.

    Мы может использовать это руководство для создания простого компонента (Bean):

    //: frogbean:Frog.java

    // Тривиальный JavaBean.

    package frogbean; import java.awt.*; import java.awt.event.*;

    class Spots {}

    public class Frog { private int jumps; private Color color; private Spots spots; private boolean jmpr; public int getJumps() { return jumps; } public void setJumps(int newJumps) { jumps = newJumps; } public Color getColor() { return color; } public void setColor(Color newColor) { color = newColor; } public Spots getSpots() { return spots; } public void setSpots(Spots newSpots) { spots = newSpots; } public boolean isJumper() { return jmpr; } public void setJumper(boolean j) { jmpr = j; } public void addActionListener( ActionListener l) { //...

    } public void removeActionListener( ActionListener l) { // ...

    } public void addKeyListener(KeyListener l) { // ...

    } public void removeKeyListener(KeyListener l) { // ...

    } // "Обычный" публичный метод:

    public void croak() { System.out.println("Ribbet!"); } } ///:~

    Прежде всего, вы можете видеть, что это просто класс. Обычно все ваши поля будут private, и доступны только через методы. Следуя соглашению об именах, получим свойства jumps, color, spots и jumper (обратите внимание на регистр первой буквы имени свойства). Хотя имя внутреннего идентификатора такое же, как и имя свойства в первых трех случаях, в jumper вы можете видеть, что имя свойства не ограничивает вас в использовании определенного идентификатора для внутренней переменной (или, на самом деле, даже иметь любые внутренние переменные для этого свойства).

    События, обрабатываемые этим компонентом, это ActionEvent и KeyEvent, основываются на наименовании методов “add” и “remove” для ассоциированного слушателя. И, наконец, вы можете видеть, что обычный метод croak( ) все еще является частью компонента, потому что это public метод, а не потому, что он удовлетворяет какой-то схеме названий.


    Содержание раздела