Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

Java - как вам оно   Найти похожие ветки 

 
VirEx ©   (2006-07-22 16:51) [40]


>  [38] iZEN ©   (22.07.06 16:26)
> В J2ME классов ArrayList и LinkedList нет, так что используйте
> Vector.

о чем и речь


> О, ужас. Вы что читали? Какие книги такие пространные примеры
> приводят?

я ничего не читал, и это рабочий пример


> Для конкатенации строк лучше использоать класс StringBuffer,
> а не прямое присваивание s1 + s2/ Пример:
> StringBuffer sbf = new StringBuffer();
> String result = sbf.append(s1).append(s2);
>
> Неплохо бы изучить Java Collection Framework.

я не приводил работу со строками, о чем это вы? :)
а еще можно же так: s+=s1

учить Java Collection Framework? вы об этом? :) :
String str = "abc";
char data[] = {"a", "b", "c"};
String str = new String(data);
String cde = "cde";
String c = "abc".substring(2,3);
String d = cde.substring(1, 2);

к тому же каждый класс по своему имеет плюсы и минусы при использовании в конкретных задачах (StringBuffer хорош в многопоточных приложениях - "String buffers are safe for use by multiple threads."), поэтому всё зависит от ситуации (String после компиляции не так сильно увеличит размер апплета чем StringBuffer, или я не прав?)

конкатенация (от concat) - не думаю что это включат в русский словарь поэтому не стОит увлекаться "американизацией"/"янкинизацией", иначе вас другие не поймут :)


> В Eclipse нажать в редакторе [Ctrl]+[Shift]+[T] и код автоматически
> отформатируется. Настроить свои правила форматирования можно
> в настройках редактора java-кода среды.

у меня и так машина слабая, какие еще IDE, да еще и на яве?
юзаю AsmEdit 2.2, хотя сейчас больше пользую Notepad++


 
VirEx ©   (2006-07-22 17:18) [41]


> iZEN

посмотрел я на вашем сайте примеры мидлетов на j2me - почему не используете switch?:
   public void commandAction(Command c, Displayable d) {
       if (c == splash.getMoreCommand()) {
           splash.suspend();
           //ball.start();
           Display.getDisplay(this).setCurrent(game);
       } else if (c == splash.getExitCommand()) {
           splash.suspend();
           ball.pause();
           this.destroyApp(true);
       } else if (c == game.getStartGameCommand()) {

можно так:
public void commandAction(Command c, Displayable d) {
switch(c) {
 case(splash.getMoreCommand()){
   splash.suspend();
   Display.getDisplay(this).setCurrent(game);
 }
 break;

 case(splash.getExitCommand()){
   splash.suspend();
   ball.pause();
   this.destroyApp(true);
 }
 break;

 default: /* to do */ ;
}


 
DiamondShark ©   (2006-07-22 17:34) [42]


> можно так:

А точно можно? Неконстантные выражения в case?


 
VirEx ©   (2006-07-22 18:07) [43]


> [42] DiamondShark ©   (22.07.06 17:34)
>
> > можно так:
>
> А точно можно? Неконстантные выражения в case?

а что мешает объявить новую переменную как константу (final) и присвоить ей значение "неконстанты"?

его класс:
package floresiris.livetech.ball.ui;
...
public class Splash extends PopupForm {
   private Command more, exit;
   private ImageItem splashImage;
   /**
    * Конструктор без параметров.
    */
   public Splash(String title) {
       super(title);
       more = new Command(I18NResources.getString(I18NResources.ID_GAME_MORE), Command.OK, 1);
       exit = new Command(I18NResources.getString(I18NResources.ID_GAME_EXIT), Command.EXIT, 2);
       this.addCommand(more);
       this.addCommand(exit);
       try {
           String path = "/images/firefox.png";
           Image image = Image.createImage(path);
           splashImage = new ImageItem(I18NResources.getString(I18NResources.ID_GAME_NAME), image, ImageItem.LAYOUT_CENTER, "");
           this.append(splashImage);
       } catch (Exception e) {}
   }
   public Command getMoreCommand() {
       return more;
   }
   public Command getExitCommand() {
       final Command e_= exit;
       return e_;
   }

}


 
VirEx ©   (2006-07-22 18:10) [44]

хм... с int проходит а с Command нет :(


 
VirEx ©   (2006-07-22 18:22) [45]

тогда делаем так (ограничиваемся типами команд):
  public int getExitCommand() {
      return exit.getCommandType();
  }

а ловим так:
public void commandAction(Command c, Displayable d) {
switch(c) {
case(Command.EXIT){
  splash.suspend();
  ball.pause();
  this.destroyApp(true);
}
break;


 
iZEN ©   (2006-07-22 18:25) [46]


> VirEx ©   (22.07.06 16:51) [40]
> >  [38] iZEN ©   (22.07.06 16:26)
> > Для конкатенации строк лучше использоать класс StringBuffer,
>
> > а не прямое присваивание s1 + s2/ Пример:
> > StringBuffer sbf = new StringBuffer();
> > String result = sbf.append(s1).append(s2);
> >
> > Неплохо бы изучить Java Collection Framework.
>
> я не приводил работу со строками, о чем это вы? :)
это к слову пришлось. Потому что многие начинающие, не зная основ строк java пытаются в цикле формировать длинную строку. И конечно получают жуткие тормоза. Ведь конкатенация (присоединение) строк друг к дружке в 100-200 раз медленнее, чем это можно сделать через StringBuffer.

> VirEx ©   (22.07.06 16:51) [40]
> а еще можно же так: s+=s1
>
> учить Java Collection Framework? вы об этом? :) :
> String str = "abc";
> char data[] = {"a", "b", "c"};
> String str = new String(data);
> String cde = "cde";
> String c = "abc".substring(2,3);
> String d = cde.substring(1, 2);
Нет. Это другое.
Collection Framework API создавался для удобного манипулирования списком объектов, вернее, ссылками на группу объектов, которые могут быть разных типов (принадлежать к разным классам). К нему относятся интерфейсы Map, List и др. классы-контейнеры, которые могут хранить и манипулировать хранящимися ссылками на другие объекты.


> VirEx ©   (22.07.06 16:51) [40]
>
> к тому же каждый класс по своему имеет плюсы и минусы при
> использовании в конкретных задачах (StringBuffer хорош в
> многопоточных приложениях - "String buffers are safe for
> use by multiple threads."), поэтому всё зависит от ситуации
> (String после компиляции не так сильно увеличит размер апплета
> чем StringBuffer, или я не прав?)
Не сильно. Это из разряда: "экономия на спичках" выливается в тормозааа.
> VirEx ©   (22.07.06 16:51) [40]
>
> конкатенация (от concat) - не думаю что это включат в русский
> словарь поэтому не стОит увлекаться "американизацией"/"янкинизацией",
>  иначе вас другие не поймут :)
Конкатенация - сложение - общеупортебимый в информатике термин.
> VirEx ©   (22.07.06 16:51) [40]
>
> > В Eclipse нажать в редакторе [Ctrl]+[Shift]+[T] и код
> автоматически
> > отформатируется. Настроить свои правила форматирования
> можно
> > в настройках редактора java-кода среды.
>
> у меня и так машина слабая, какие еще IDE, да еще и на яве?
Eclipse писалась с прицелом на эффективное использование на обычных машинах. Внутри используются нативные вызовы для построения интерфейса (GUI) средствами операционной системы.

> VirEx ©   (22.07.06 16:51) [40]
>
> юзаю AsmEdit 2.2, хотя сейчас больше пользую Notepad++

Напрасно. Редакторы с подсветкой синтаксиса хороши, когда нужно просто смотреть код. Но когда дело доходит до рефакторинга кода, то IDE незаменимы.
> VirEx ©   (22.07.06 17:18) [41]
> > iZEN
> посмотрел я на вашем сайте примеры мидлетов на j2me - почему
> не используете switch?
Потому что switch неэффективен. И ссылки не понимает. Понимает только объекты примитивного типа int и константы типа char.


 
VirEx ©   (2006-07-22 18:30) [47]


>  [45] VirEx ©   (22.07.06 18:22)

т.е.
ловим так:
public void commandAction(Command c, Displayable d) {
switch(с.getCommandType()) {
case(Command.EXIT){
 splash.suspend();
 ball.pause();
 this.destroyApp(true);
}
break;


 
DiamondShark ©   (2006-07-22 19:20) [48]


> Потому что switch неэффективен. И ссылки не понимает. Понимает
> только объекты примитивного типа int и константы типа char.

Ограничение примитивными типами как раз и позволяет сделать switch максимально эффективным.

А вообще, странный какой-то switch, подозрительный.
Параметр Command c -- какой-то сложный объект?
А методы getXXX возвращают те же экземпляры, что приходит в пораметр?
Бр-рр... Ну и зависимости...


 
iZEN ©   (2006-07-22 19:49) [49]


> VirEx ©   (22.07.06 18:22) [45]
>
> тогда делаем так (ограничиваемся типами команд):
>   public int getExitCommand() {
>       return exit.getCommandType();
>   }
>
> а ловим так:
> public void commandAction(Command c, Displayable d) {
> switch(c) {
> case(Command.EXIT){
>   splash.suspend();
>   ball.pause();
>   this.destroyApp(true);
> }
> break;

Это ты что хотел этим показать?
Что Command.EXIT — целочисленная константа и ничего более.
Это не тип!
Таких "команд", с позволения сказать, во всём приложении по формам может быть много разбросано, а обработчик у меня на всех один...как тогда я узнаю, что Command.EXIT относится к открытой форме, а не к закрытой, которая тоже, в принципе, может генерировать события (нить, например, там может быть) типа Command с тем же самым целочисленным идентификатором EXIT?
Нет уж, я как-нибудь через идентификатор объекта/ссылки обойдусь, ведь она у всех объектов будет разная.

Ссылки на объект, имеющие одинаковое значение, являются ссылками на один и тот же объект. Поэтому и использую блок if-else, чтобы определить, какая команда (событие о команде) откуда пришла.

Кроме того, целочисленные константы Command.EXIT, Command.OK, Command.BACK и др. определены на уровне KVM телефона, и она располагает надписи софт-клавиш на экране, исходя из предназначения команды/события и тех дизайнерских требований, которые заложили в систему экранного меню разработчики телефона. Скажем, если я создам:
exit = new Command(I18NResources.getString(I18NResources.ID_GAME_EXIT), Command.OK, 2);
вместо
exit = new Command(I18NResources.getString(I18NResources.ID_GAME_EXIT), Command.EXIT, 2);
то на экране телефона пункт софт-клавиши отобразиться уже в другом углу или вообще будет представлять из себя пункт меню. Тем не менее, активизация этой команды пользователем ничего не меняет — CommandListener перехватит именно эту команду (ссылку Command c), но, естественно, с другим идентификатором — Command.OK. Так же он поступит (он у меня один на всех) с другими командами-событиями от других форм, в которых тоже может быть идентификатор Command.OK. Так что ориентироваться на тип команды нельзя, вместо этого лучше знать её ссылку, что и делаю я, возвращая её в методах форм:
public Command getMoreCommand() {
    return more;
}.


 
VirEx ©   (2006-07-22 19:54) [50]


>  [48] DiamondShark ©   (22.07.06 19:20)

Command - объкт, а switch понимает только примитивы int, char


 
iZEN ©   (2006-07-22 20:03) [51]


> DiamondShark ©   (22.07.06 19:20) [48]
>
>
> > Потому что switch неэффективен. И ссылки не понимает.
> Понимает
> > только объекты примитивного типа int и константы типа
> char.
>
> Ограничение примитивными типами как раз и позволяет сделать
> switch максимально эффективным.
>
> А вообще, странный какой-то switch, подозрительный.
> Параметр Command c -- какой-то сложный объект?
> А методы getXXX возвращают те же экземпляры, что приходит
> в пораметр?
> Бр-рр... Ну и зависимости...
>

Не всё так страшно.
Можно полностью инкапсулировать обработку команд в той форме, на которой они и происходят. Это у меня обработчик один, но на самом деле интерфейс CommandListener может реализовать любая форма и отлавливать внутри себя свои события, только надо объявить, что форма имплементирует этот интерфейс:
public class Splash extends PopupForm implements CommandListener {
...
Сказать, чтобы она ловила события (можно в конструкторе после добавления команд):
this.setCommandListener(this);

и реализовать метод слушателя:
public void commandAction(Command c, Displayable d) {
       if (c == splash.getMoreCommand()) {
           splash.suspend();
           //ball.start();
           Display.getDisplay(this).setCurrent(game);
       }
...
}
Правда, при этом возникнут сложности с переходами между формами, а значит надо будет либо параметризовать (при создании), какая форма (game, например) будет следующей, когда закроется она. Либо вводить глобальную область видимости, когда формы приложения будут знать обо всех остальныхэкземплярах и отображать, когда следует (то есть городить огород с нарушением инкапсуляции или изобретать способ получения ссылок на другие формы).


 
VirEx ©   (2006-07-22 20:04) [52]


>  [49] iZEN ©   (22.07.06 19:49)
> Что Command.EXIT — целочисленная константа и ничего более.
> Это не тип!

я знаю, про то и речь что switch не понимает ничего кроме примитивов, а эта константа в j2me означает тип Command, поэтому максимум что можно сделать через оператора switch - проверить на тип команды (т.е. константу в данном случае)

(остальное что ты мне объясняешь в своём посте я знаю :) )


 
iZEN ©   (2006-07-22 20:05) [53]

Поправочка.
Внутренний код формы будет другим:
public void commandAction(Command c, Displayable d) {
      if (c == this.getMoreCommand()) {
          this.suspend();
          Display.getDisplay(this).setCurrent(game);
      }
...
}


 
iZEN ©   (2006-07-22 20:13) [54]

И ещё поправочка (пишу впопыхах).
Код вызова:
Display.getDisplay(this).setCurrent(game);
вместо this требует ссылку на объект класса MIDlet или на объект его наследника. Так что опять придётся думать над тем, как параметризовать форму (которая до этого ничего не знала о мидлете) ссылкой на её хозяина — экземпляр BallMIDlet.

Впрочем, это у меня показано на примере PopupForm, где производится достаточно гибкая параметризация ссылками на мидлет (owner) и объект Displayable (after), который будет отображатся после автоматического закрытия экземпляра PopupForm.


 
pasha_golub ©   (2006-07-24 22:22) [55]

Это что же за жизнь пошла... чтобы две строки склеить надо классами пользоваться.


 
Ketmar ©   (2006-07-24 22:26) [56]

>pasha_golub ©   (24.07.06 22:22) [55]
это фигня. скоро чтобы сложить 2 и 3 надо будет создать пять классов. %-)


 
Mike Kouzmine ©   (2006-07-24 23:39) [57]

Да и сейчас многие пишут имея всего один класс.


 
iZEN ©   (2006-07-25 11:24) [58]


> Mike Kouzmine ©   (24.07.06 23:39) [57]
> Да и сейчас многие пишут имея всего один класс.

и большой switch/case в единственном методе commandAction...


 
iZEN ©   (2006-07-25 11:27) [59]


> pasha_golub ©   (24.07.06 22:22) [55]
>
> Это что же за жизнь пошла... чтобы две строки склеить надо
> классами пользоваться.

Это — к Sun, создателю языка. Нет бы усовершенствовать класс String до уровня StringBuffer, тогда бы все проблемы с конкатенацией решились. Не захотела, почему-то.



Страницы: 1 2 вся ветка

Текущий архив: 2006.08.20;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.063 c
4-1146398027
oto
2006-04-30 15:53
2006.08.20
измененя размери окна


15-1153989001
Alert2006
2006-07-27 12:30
2006.08.20
Координаты


15-1153330577
Nic
2006-07-19 21:36
2006.08.20
Музыка


3-1149944456
lluha
2006-06-10 17:00
2006.08.20
Access и DBGrid


1-1152283411
slaga
2006-07-07 18:43
2006.08.20
Как прочитать "мультистроковый параметр" с регистра.