Java → Что может и чего не может мидлет

Автор: Mank
Дата публикации: 01.09.2003 09:58
J2ME



Многие люди имеющие опыт программирования, когда сталкиваются с технологией J2ME, попадают впросак, в связи с тем, что хоть мидлет и является небольшой программкой в телефоне, но оказывается, что он многого не может сделать принципиально. Здесь перечислены основные моменты того, что не может делать стандартный мидлет. (В данной статье рассматривается MIDP 1.0)

Итак по-порядку.

Нет поддержки чисел с плавающей точкой (floating point). Это связано с тем, что в устройствах с ограниченными ресурсами отсутствует поддержка floating point. Поддержка же на программном уровне была бы слишком дорогим удовольствием. В JVM которая поддерживает CLDC отсутствуют байткоды связанный с типами float и double.

Что из этого следует. Придется вам работать только с целочисленными значениями. О float и double забудьте.

java.lang.Math - элементарен до безобразия. Те, кто знаком с технологией Java, знают, что данный класс содержит методы, совершающие основные числовые операции, такие как экспонента, логарифм, тригонометрические операции. Так вот, в мидлете они не доступны. java.lang.Math имеет только 3 метода: abs (int a),
max (int a, int b), min (int a, int b). Отсутствует метод finalize(). Это требование связано с необходимостью упрощения механизма сборки мусора. Для тех кто не знаком с Jav'ой, можно перефразировать иначе, нет никаких деструкторов. Хотя метод finalize() - это не деструктор или это не удавшийся деструкторsmile.gif). Кто не согласен с этим, читайте здесь. Для тех, кто знаком с Jav'ой, можно добавить, что нет weak references. Так же Object - не имеет метода clone. И, слава богу.

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

Отсутсвует Java Native Interface (JNI). Поддержка JNI была отклонена по двум причинам. Первая, ограничения, накладываемые security моделью. (Данная модель запрещает использовать native вызовы.) Вторая, полная реализация JNI была признана слишком дорогой для устройств с ограниченными ресурсами. Таким образом, вам доступна только Java и ничего больше. Даже если у вас и телефон с Symbian, запустив на нем мидлет, о возможностях Symbian не вспоминайте. (Это касается конечно, если производитель телефонов, не выходит за рамки MIDP 1.0.)

Нельзя создать свой ClassLoader. Это ограничение накладываемое security моделью. Так, что нельзя управлять динамической загрузкой классов.

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

Есть многопоточность, но нет ThreadGroup и демонов. Операции, такие как запуск и остановка нитки, могут быть применены только над отдельной ниткой. Thread к тому же "безыимянен", и к счастью не имеет методов stop, resume, suspend (которые были deprecated в J2SE). Также нет методов enumerate и interrupt.

Class - важные методы, которые у него есть это: forName(), getName(), getResourceAsStream(), newInstance(). Так, что создать экземпляр класса, при помощи методов forName() и newInstance() можно. (Так, что можно сказать, что кусочек Reflection механизма все же есть, но не более.) А при помощи метода getResourceAsStream() можно найти ресурс.

Throwable - отсутсвует метод getCause(). Нельзя выстроить цепочку исключений (exception chaining). Метод printStackTrace() позволяет печатать Throwable, только в стандартный поток ошибок.

Boolean, Byte, Character, Integer, Long, Short - Классы-обертки для простых типов есть!

String, StringBuffer - тоже есть!. Правда в урезанном варианте.

System - присутсвуют методы arraycopy, currentTimeMillis, gc, getProperty, identityHashCode вот и все. О методе exit() забудьте. Жизненый цикл мидлета основан на трех методах класса MIDlet: startApp, pauseApp, destroyApp.

Collection API - представлен следующими классами: Hashtable, Vector, Stack, Enumeration.

java.util - представлен следующими классами: Random, Date, Timer, TimerTask, Calendar, TimeZone.

java.io - 11 классов, но их хватает.

Connection MIDP 1.0 обязывает производителей опираться только на http. (MIDP 2.0 еще и https) Но не обольщайтесь. Если есть http, это не значит, что есть сокеты. http может быть реализован как на TCP/IP, так и на wap или i-mode. Все остальное (Bluetouth, comm, socket, datagramm и т.д.) может быть, а может и не быть, это опционально (зависит от производителя).

Оконный интерфейс отсутсвует. Нет никаких объектов Window, Dialog, Frame. Центральным звеном пользовательского интерфейса MIDP является объект Displayable. Каждый мидлет имеет Display, на котором одновременно может показываться только один Displayable объект. Displayable объект, является функциональной единицей, которая инкапсулирует специфичный для устройства графический интерфейс и взаимодействие с пользователем. Display отвечает за то, какой Displayable объект должен показываться на экране. Существует только один Display экземпляр для одного мидлета. Метод Display.getDisplay() возвращает объект Display для мидлета. Главным методом этого класса являеться метод setCurrent (Displayable next), который позволяет менять различные объекты на экране.
К Displayable можно добавить комманду и установить 'слушателя' для комманды.

Существует пять классов, которые расширяют Displayable:

List позволяет выбрать пользователю елементы из списка. Каждый элемент в списке представляется строчкой и может иметь Image.
TextBox позволяет пользователю вводить и редактировать текст.
Alert можно сравнить с диалоговым окном, оповещающим о какой-то произошедшей ситуации.
Form может содержать комбинацию элементов, которые могут представлять строчки, изображения, поля ввода, списки.
Canvas позволяет приложению самому обеспечивать отрисовку, переопределив метод paint (Graphics g)
Graphics - позволяет нарисовать изображение, строчку, элипс, прямоугольник, линию. Вот почти и все.

Font - Можно получить только тот шрифт который предоставит телефон. Для этого есть статический метод Font.getFont (int face, int style, int size). Все многообразие шрифтов, предоставляемое мидлету, заключено в параметрах этого метода. (А метод setFont (Font f), есть только у Graphics, а Graphics только у Canvas.)

RMS API позволяет сохранять небольшие небольшие порции данных в постоянное место хранения. Эти данные хранятся до тех пор, пока не будет удален мидлет. Но другим мидлетам, данная информация не будет доступна. (MIDP 2.0 позволяет другому мидлету, иметь доступ к этим данным, при условии, если тот, имеет необходимые привелегии.) Но не пытайтесь думать, что это какие-то файлы. Понятие File для MIDP не существует.

Подсветка экрана и вибратор, звук. В MIDP 1.0 отсутсвуют, появились только в MIDP 2.0.

Теперь, зная все это, хорошенько подумайте, а нужен ли вам телефон с Jav'ой, и нужно ли вам лезть в J2ME? smile.gif))
(Надеюсь, ваш ответ все равно будет положительным.)

P.S.
Вы можете сказать, почему же, несмотря на то, что многих возможностей в MIDP 1.0 нет, многие телефоны обладают такими возможностями. Это касается, например подсветки экрана, вибратора, звука, файлов (на Siemens). А это потому, что производители добавляют свой API, реализуюший данные возможности. В связи с этим, мидлет сделанный для одного телефона, может не работать на другом. Здесь видна проблема того, что стандартизация отстает от рынка. С выходом MIDP 2.0 многое сгладится.
Добавил: javavirys ( 2017-02-12 02:06:03 )
Теги:J2ME MIDProfile
Рейтинг: + 1 -
Просмотров: 2392

Специальные предложения