Графические примитивы Построения графического интерфейса

Базовые понятия языка Java

Классы-утилиты

Принципы построения графического интерфейса

Графические примитивы

Основные компоненты их размещение Обработка событий в JAVA

Апплеты, изображения и звук в JAVA

Подпроцессы, потоки ввода/вывода, сетевые средства

Введение в настраиваемые типы данных

Новая версия JDK - Java 2 Platform Standard Edition Version 5.0 - предоставляет программисту некоторый набор новых возможностей. Одной из таких возможностей являются настраиваемые типы данных. Программисты, которые работают на языке С++, привыкли использовать шаблоны классов и функций. Эта же возможность в Java 2 версии 5.0 называется созданием настраиваемого типа. С помощью таких типов данных можно разработать универсальный класс, автоматически обрабатывающий данные различных типов. Таким образом, разрабатывается один алгоритм обработки данных, который затем применяется без дополнительной доработки к различным типам данных.
Разберем принципы создания и использования настраиваемого класса на примере. Создаем настраиваемый класс.
class Gen<T>
{
T ob;
public Gen (T o) {ob=o;}
public T getOb() {return ob;}
public void showType(Graphics g, int x, int y)
{
g.setColor(Color.green);
g.drawString("Тип T "+ob.getClass().getName(),x,y);
}
}

Здесь Т - параметр типа. Это имя используется как заменитель действительного типа, передаваемого в класс Gen в качестве параметра. Далее имя Т будет использоваться в классе везде, где требуется переменная или параметр этого типа. Например, он используется для объявления переменной класса, в качестве параметра в конструкторе класса, а также как тип возвращаемого значения в методе getOb. Если при создании объекта будет передан тип String, то у переменной ob будет тип String. Таким образом, реальный тип данных определится только при создании объекта.
Создадим класс, который будет являться внешним для созданного настраиваемого класса Gen и будет демонстрировать работу с этим внутренним классом.
public class GenDemo extends Applet
{
Gen<Integer> iOb;
Gen<String> strOb;
public void init()
{
int i=Integer.parseInt(getParameter("intParam"));
iOb=new Gen<Integer>(i);
String s=getParameter("strParam");
strOb=new Gen<String>(s);
}

public void paint(Graphics g)
{
iOb.showType(g, 10,10);
strOb.showType(g, 30,10);
}
class Gen<T>
{
// объявление настраиваемого класса Gen
...
}
}
Итак, в апплет передается два параметра. Один из них - целое число, другой - символьная строка. Для хранения этих данных в классе GenDemo объявляются ссылки на объекты типов Gen<Integer> и Gen<String>. Типы данных Integer и String в данном случае являются параметрами настраиваемых типов. При создании первой ссылки параметру T класса Gen присваивается значение Integer. Это значит, что генерируется реализация класса Gen для работы с целыми числами и iOb является объектом именно этого класса. Во втором случае аналогичная работа проводится со значением типа String и объектом strOb. Далее при работе с объектом iOb везде, где упоминался тип Т в классе Gen используется тип Integer, а при работе с объектом strOb тип Т становится типом String.
При создании настраиваемых классов требуется иметь в виду следующее правило. При объявлении объекта настраиваемого типа данных аргумент типа, передаваемый классу как параметр, должен быть каким-либо классом. Использование в качестве аргумента типа стандартных типов данных, например, int или char, не разрешается. Если же возникнет такая необходимость, требуется использовать класс-оболочку, соответствующий нужному стандартному типу данных.

Математический анализ, лекции по физике Компьютерные сети