konhon

忘掉過去,展望未來。找回自我,超越自我。
逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.

Google

BlogJava 首页 新随笔 联系 聚合 管理
  203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks

#

SRP 单一职责原则
        就一个类而言,应该仅有一个引起它变化的原因。

OCP 开放-封闭原则
         软件实体(类、模块、函数)应该可以扩展, 但不可修改。

LSP Liskov替换原则
        子类型必须能够替换它们的基类型。

DIP 依赖倒置原则
        抽象不应该依赖于细节。细节应该依赖于抽象。

ISP 接口隔离原则
       不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。

REP 重用发布等价原则
        重用的粒度就是发布的粒度。

CCP 共同封闭原则
         包中的所有类对于同一类性质的变化应该是共同封闭的,一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响。

CRP 共同重用原则
         一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。

ADP 无环依赖原则
         朝着稳定的方向进行依赖。

SAP 稳定抽象原则
        包的抽象程度应该和其稳定程度一致。
posted @ 2005-09-05 01:05 konhon 优华 阅读(328) | 评论 (0)编辑 收藏

RecordStore是已byte陣列存儲的.所以需要將整個物件序列化成byte 陣列存入紀錄倉儲,也可以從資料倉儲之中讀入一個byte 陣列,然後將其回復成原本物件內部的狀態。
在此我們要借助四個類別的協助,他們分別是:
ByteArrayOutputStream、ByteArrayInputStream、
DataOutputStream、DataInputStream。

轉換例子如下:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;

public class FriendData {
    String name;

    String tel;

    boolean sex;

    
int age;

    
public FriendData() {
        name 
= "NO NAME";
        tel 
= "NO TEL";
        sex 
= false;
        age 
= 0;
    }


    
public byte[] encode() {
        
byte[] result = null;
        
try {
            ByteArrayOutputStream bos 
= new ByteArrayOutputStream();
            DataOutputStream dos 
= new DataOutputStream(bos);
            dos.writeUTF(name);
            dos.writeUTF(tel);
            dos.writeBoolean(sex);
            dos.writeInt(age);
            result 
= bos.toByteArray();
            dos.close();
            bos.close();
        }
 catch (Exception e) {
        }

        
return result;
    }


    
public void decode(byte[] data) {
        
try {
            ByteArrayInputStream bis 
= new ByteArrayInputStream(data);
            DataInputStream dis 
= new DataInputStream(bis);
            name 
= dis.readUTF();
            tel 
= dis.readUTF();
            sex 
= dis.readBoolean();
            age 
= dis.readInt();
            dis.close();
            bis.close();
        }
 catch (Exception e) {
        }

    }

}

posted @ 2005-09-02 02:21 konhon 优华 阅读(620) | 评论 (0)编辑 收藏

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class LLEventMIDlet extends MIDlet {
    
private Display display;

    
public LLEventMIDlet() {
        super();
        display 
= Display.getDisplay(this);
        
// TODO Auto-generated constructor stub
    }


    
protected void startApp() throws MIDletStateChangeException {
        
// TODO Auto-generated method stub
        MyCanvas mc = new MyCanvas();
        display.setCurrent(mc);
    }


    
protected void pauseApp() {
        
// TODO Auto-generated method stub

    }


    
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
        
// TODO Auto-generated method stub

    }


    
private class MyCanvas extends Canvas {
        String action 
= "";

        
public void paint(Graphics g) {
            g.setColor(
255255255);
            g.fillRect(
00, getWidth(), getHeight());
            g.setColor(
000);
            
if (hasRepeatEvents()) {
                g.drawString(
"Repeat"10100);
            }
 else {
                g.drawString(
"NonRepeat"10100);
            }

            g.drawString(action, 
10200);
        }

        
protected void keyPressed(int keyCode){
            action 
= "KP: " + (char)keyCode;
            repaint();
        }

        
protected void keyReleased(int keyCode){
            action 
= "KR: " + (char)keyCode;
            repaint();
        }

        
protected void keyRepeated(int keyCode){
            action 
= "KRe: " + (char)keyCode;
            repaint();
        }

    }


}



在MIDP 1.0 規格中,Canvas 類別裡頭定義了幾個常數,他們分
別是: KEY_NUM0 、KEY_NUM1 、KEY_NUM2 、KEY_NUM3 、KEY_NUM4 、KEY_NUM5 、KEY_NUM6 、KEY_NUM7 、KEY_ NUM8 、KEY_NUM9 、KEY_STAR、KEY_POUND 共11 個,分別代表0~9 的數字鍵、星號鍵、以及井號鍵。我們可以利用這幾個常數判定鍵盤(按鈕)事件處理函式所傳進來的keyCode,藉以了解哪個按鈕被按下了,當然,除了這些按鍵之外,其他的按鍵也會有其對應值,您必須自己嘗試找出來,但是為了可以跨平台,建議您僅只使用這些標準的定義鍵。

為了Game 設計師的方便,MIDP 1.0 規格中,Canvas 類別裡頭定義了幾個與Game 鍵盤代碼相關的常數,他們分別是UP、DOWN、LEFT、RIGHT、FIRE、GAME_A、GAME_B、GAME_C、GAME_D。這些定義雖然很可能會和之前的定義有所重複,但是因為有了一層抽象性,在移植的時候也就方便多了。

那麼,在程式裡頭該如何處理呢? Canvas 裡頭提供了兩個函式:
1. getGameAction() 􀂌 傳入keyCode,函式會回傳所代表的
Game 鍵盤代碼。
用法如下:
public void keyPressed(int keyCode)
{
switch(getGameAction(keyCode))
{
case Canvas.LEFT:
moveLeft() ;
break ;
case Canvas.FIRE:
fire() ;
break ;

}

}


2. getKeyCode() 􀂌 傳入Game 鍵盤代碼,函式會回傳所代表的
keyCode。
用法如下:
public void keyPressed(int keyCode)
{
if(keyCode == getKeyCode(Canvas.LEFT))
{
moveLeft() ;
}
else if(keyCode == getKeyCode(Canvas.FIRE))
{
fire() ;
}


}
任選任何一種方法,都可以達到跨平台的目的。
posted @ 2005-09-01 04:19 konhon 优华 阅读(953) | 评论 (0)编辑 收藏

其實這是有一套規格可循的。規則如下:

1. 先比較每個Command 物件的命令型態,優先順序越高的越先出現。
在Command 物件之中共定義了八種命令型態,從優先順序最高到最低列表如下:
Command.BACK
Command.CANCEL
Command.EXIT
Command.HELP
Command.ITEM
Command.OK
Command.SCREEN
Command.STOP


2. 如果命令型態相同,就比較其優先權,設定值越低的越先出現。

3. 如果優先權相同,就以利用addCommand()加入畫面的先後順序決定。
posted @ 2005-09-01 03:10 konhon 优华 阅读(1172) | 评论 (0)编辑 收藏

转载自:www.csdn.net

java程序显示中文是大家都遇到过的问题,尤其是JAD文件的中文问题,一般都用native2ascii工具转换,这里收藏了native2ascii工具的详细说明:


native2ascii - Native-to-ASCII Converter
Converts a file with native-encoded characters (characters which are non-Latin 1 and non-Unicode) to one with Unicode-encoded characters. 
SYNOPSIS
native2ascii [options] [inputfile [outputfile]]

DESCRIPTION
The Java compiler and other Java tools can only process files which contain Latin-1 and/or Unicode-encoded (\udddd notation) characters. native2ascii converts files which contain other
 character encodings into files containing Latin-1 and/or Unicode-encoded charaters. 
If outputfile is omitted, standard output is used for output. If, in addition, inputfile is 
omitted, standard input is used for input. 

OPTIONS
-reverse 
Perform the reverse operation: convert a file with Latin-1 and/or Unicode encoded characters to one with native-encoded characters. 


-encoding encoding_name 
Specify the encoding name which is used by the conversion procedure. 
The default encoding is taken from System property file.encoding. 
The encoding_name string must be a string taken from the first column of the table 
below. 


-------------------------------------------------------------

Converter        Description
Class
-------------------------------------------------------------

8859_1           ISO 8859-1
8859_2           ISO 8859-2
8859_3           ISO 8859-3
8859_4           ISO 8859-4
8859_5           ISO 8859-5
8859_6           ISO 8859-6
8859_7           ISO 8859-7
8859_8           ISO 8859-8
8859_9           ISO 8859-9
Big5             Big5, Traditional Chinese
CNS11643         CNS 11643, Traditional Chinese
Cp037            USA, Canada(Bilingual, French), Netherlands,
                               Portugal, Brazil, Australia
Cp1006           IBM AIX Pakistan (Urdu)
Cp1025           IBM Multilingual Cyrillic: Bulgaria, Bosnia,
                               Herzegovinia, Macedonia(FYR)
Cp1026           IBM Latin-5, Turkey
Cp1046           IBM Open Edition US EBCDIC
Cp1097           IBM Iran(Farsi)/Persian
Cp1098           IBM Iran(Farsi)/Persian (PC)
Cp1112           IBM Latvia, Lithuania
Cp1122           IBM Estonia
Cp1123           IBM Ukraine
Cp1124           IBM AIX Ukraine
Cp1125           IBM Ukraine (PC)
Cp1250           Windows Eastern European
Cp1251           Windows Cyrillic
Cp1252           Windows Latin-1
Cp1253           Windows Greek
Cp1254           Windows Turkish
Cp1255           Windows Hebrew
Cp1256           Windows Arabic
Cp1257           Windows Baltic
Cp1258           Windows Vietnamese
Cp1381           IBM OS/2, DOS People's Republic of China (PRC)
Cp1383           IBM AIX People's Republic of China (PRC)
Cp273            IBM Austria, Germany
Cp277            IBM Denmark, Norway
Cp278            IBM Finland, Sweden
Cp280            IBM Italy
Cp284            IBM Catalan/Spain, Spanish Latin America
Cp285            IBM United Kingdom, Ireland
Cp297            IBM France
Cp33722          IBM-eucJP - Japanese (superset of 5050)
Cp420            IBM Arabic
Cp424            IBM Hebrew
Cp437            MS-DOS United States, Australia, New Zealand,
                               South Africa
Cp500            EBCDIC 500V1
Cp737            PC Greek
Cp775            PC Baltic
Cp838            IBM Thailand extended SBCS
Cp850            MS-DOS Latin-1
Cp852            MS-DOS Latin-2
Cp855            IBM Cyrillic
Cp857            IBM Turkish
Cp860            MS-DOS Portuguese
Cp861            MS-DOS Icelandic
Cp862            PC Hebrew
Cp863            MS-DOS Canadian French
Cp864            PC Arabic
Cp865            MS-DOS Nordic
Cp866            MS-DOS Russian
Cp868            MS-DOS Pakistan
Cp869            IBM Modern Greek
Cp870            IBM Multilingual Latin-2
Cp871            IBM Iceland
Cp874            IBM Thai
Cp875            IBM Greek
Cp918            IBM Pakistan(Urdu)
Cp921            IBM Latvia, Lithuania (AIX, DOS)
Cp922            IBM Estonia (AIX, DOS)
Cp930            Japanese Katakana-Kanji mixed with 4370 UDC,
                               superset of 5026
Cp933            Korean Mixed with 1880 UDC, superset of 5029
Cp935            Simplified Chinese Host mixed with 1880 UDC,
                               superset of 5031
Cp937            Traditional Chinese Host miexed with 6204 UDC,
                               superset of 5033
Cp939            Japanese Latin Kanji mixed with 4370 UDC,
                               superset of 5035
Cp942            Japanese (OS/2) superset of 932
Cp948            OS/2 Chinese (Taiwan) superset of 938
Cp949            PC Korean
Cp950            PC Chinese (Hong Kong, Taiwan)
Cp964            AIX Chinese (Taiwan)
Cp970            AIX Korean
EUCJIS           JIS, EUC Encoding, Japanese
GB2312           GB2312, EUC encoding, Simplified Chinese
GBK              GBK, Simplified Chinese
ISO2022CN        ISO 2022 CN, Chinese
ISO2022CN_CNS    CNS 11643 in ISO-2022-CN form, T. Chinese
ISO2022CN_GB     GB 2312 in ISO-2022-CN form, S. Chinese
ISO2022KR        ISO 2022 KR, Korean
JIS              JIS, Japanese
JIS0208          JIS 0208, Japanese
KOI8_R           KOI8-R, Russian
KSC5601          KS C 5601, Korean
MS874            Windows Thai
MacArabic        Macintosh Arabic
MacCentralEurope Macintosh Latin-2
MacCroatian      Macintosh Croatian
MacCyrillic      Macintosh Cyrillic
MacDingbat       Macintosh Dingbat
MacGreek         Macintosh Greek
MacHebrew        Macintosh Hebrew
MacIceland       Macintosh Iceland
MacRoman         Macintosh Roman
MacRomania       Macintosh Romania
MacSymbol        Macintosh Symbol
MacThai          Macintosh Thai
MacTurkish       Macintosh Turkish
MacUkraine       Macintosh Ukraine
SJIS             Shift-JIS, Japanese
UTF8             UTF-8


不过WTK可以直接解决JAD的中文问题:
    settings>MidLets>MidLet-1属性改成你想要显示的中文后重新生成JAD和JAR文件即可。
posted @ 2005-09-01 02:10 konhon 优华 阅读(658) | 评论 (0)编辑 收藏

out momory 一阵天旋地转内存又溢出了。在手机上这种痛苦经常都有,套一句俗话在手机上用内存必须勒紧裤腰带。虽然现在pc内存上G都不奇怪,可是在手机上却只能以K来记,可能某位同志会马上跳出来说也有上M的,记住中国还不富大多数手机都是低端手机。写手机程序让我仿佛回到了dos时代(自我安慰一下那个时代也炼出了不少高手说不定我是下一个)。言归正传做内存优化可以归结为以下几种方法。代码优化,图片优化,第三方工具优化等…

一.代码优化
内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的切换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器来收尸^_^。乍看之下似乎并无不妥垃圾回收器会来善后。实际上垃圾回收器并非实时的,它不像C++的Delete语句马上释放不用的内存。当从游戏逻辑切换到主菜单逻辑这时两个对象同时存在很可能这时内存就不够用了。读到这里很多人会发现实际上垃圾回收器在j2me上并不怎么好用,从一个角度上来讲在j2me上所有垃圾必须由手工释放,除简单类型以外所有对象都必须显式地置空例如 imgs=null; 实际上java提供了一个不错的工具用来查找内存溢出,java.lang.Runtime.freeMemory() 。它可以返回当前的剩余内存数,将它适当的安放在代码中可以有效的监测内存使用状况。很大一部份的j2me程序员之前都是从事pc软件开发工作,充裕的内存掩盖了许多写代码的不良习惯。如下所示:
//a 不为空
a=new Logic();
很多人可能对此有异议,他们会认为新的对象会把旧的对象冲掉并且释放内存。这里面包含两个问题:1. 该段代码是先创建对象然后再进行赋值操作的,也就是说在这期间有两个对象同时存在这就很可能会产生溢出。2. 这样做也会妨碍垃圾回收器的工作
较好的写法如下:
a=null;
a=new Logic();
虽然麻烦了点但在j2me中还是必要的。接着看下例。
drawString("游戏时间:" + time ,50,50,Graphics.LEFT|Graphics.TOP);
"游戏时间:" + time 很完美在paint()方法当中每次都被刷一遍显示在屏幕上。危机往往隐藏在美丽的外表,该语句会引起新的内存重新分配来存储 "游戏时间:" + time 而显示完以后又必须由垃圾回收器释放,用了双倍时间,并且容易发生内存溢出。依此类推在重复执行的方法里应尽量避免重复定义对象。与paint()方法类似在循环里也有类似的情况存在。
把所有对象的初始化放在构造函数里想必是再正当不过了,大多数人通常的做法是把当前逻辑所要用到的资源通通初始化完毕。
很大一部份的内存溢出都是发生在构造函数中。内存使用的高峰期都是在构造函数中所以避开这个高峰能有效的防止溢出。建议最好的办法是第一次使用时初始化。如下所示
if (img==null){
//初始化
}
现在做游戏很多时候都需要地图数组,声音数组,还有一些其它资源这些资源很多可以放在代码中也有的可以放在文件当中。
强烈建议将这些资源放在文件中需要时在load进来。这些资源文件如果放在代码中则会占用不小的代码段空间,而代码一般是程序一运行就装载到内存当中。
除上面列举的方法外还有一些大家所熟知的顺便一提, 比如关闭没用的rms ,关闭没用的网络连接,关闭没用的流。正确地停止线程。良好的程序架构减少代码偶合性也是一个不错的方法,无论在代码调式,内存释放都可以做到非常清析。

二. 图片优化
j2me的内存杀手无疑非图片莫属,一张3k的图片可以占用20多k的内存不信大家把load前后的内存剩余打印出来对比看看。所以防止内存溢出最直接的办法就是从图片入手。
1.图片压缩: 多数人马上会想到这个办法。不错这个办法是最有效的。在photoshop里图片制作完成后不要选择 "存储为",而是选择 "存储为 web 所用格式" 可以根据里面的选项进行压缩,特别是颜色这一项越小越好不过相应的图像会有所失真。不要认为这样就完了。
实际上该图片还可以再次压缩,在网上有许多类似的工具。推荐一款可以压缩png格式的软件 xat.com Image Optimizer 效果不错。经常都有 70% 的压缩率且图像不会失真。
假如你有多张规格一样的图片,那么建议你把它做成一张长条图片。有两个原因:
1、 这样节省存储空间和内存空间。大家可做个试验将10张图片的内容放在一张当中对比看看文件大小有没有变化。
2 、10张图片需要10个image 对象需要进行10次io操作浪费时间不说还浪费内存。当笔者发现这个好处时兴奋地把所有图片都存成一张,吱地一声内存又溢出了...原因想必大家也知道!!图片太大了不要把不同界面的图片整合在一起否则经常会得不偿失。
作图时还有一些细节需要注意,颜色数量,分辩率,图像模式(最好是索引颜色),画布大小都会影响到图片大小。

三. 工具优化
谁都知道混淆器是用来保护代码的以加大反编译的难度(个人认为这是在嘲笑程序员的智商)。实际上用它来优化程序也是不错的选择,至少有两点好处:1、 压缩程序大小。一个60k的程序经常可以压掉10k左右。10k的空间对于写低端手机的程序员简直是雪中送碳,多少超过64k限制的游戏都受过它的恩惠;2、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了。
根据经验很多人都会用jb自带的混淆器RetroGuard,实际上它效果并不怎么好。推荐使用proguard 在 http://sf.net 可以免费下载,它可以比retroguard 多压缩3至4 k 以上而且安全性更好。
posted @ 2005-08-31 19:10 konhon 优华 阅读(358) | 评论 (0)编辑 收藏

昨天在網上看到有關J2me的開發, 便想試試.於是下載了開發工具.
eclipse 3.0.1, eclipseme0.4.0安裝一切正常.

安裝後便依照網上寫了一個HelloWorld程序, 運行,怪事出來啦, 模似器一閃,馬上又自動關閉啦. 看不到效果.

今天早上反把eclipse換成3.1的, eclipseme換成1.1.0的, 再試試, 問題居然解決啦, 郁悶呀, Java這東西老是怪問題, 而且大多數都版本不兼容所引起的, 開源這東西雖然好, 可是這開源程序之間的兼容可是個大問題.

posted @ 2005-08-31 19:09 konhon 优华 阅读(340) | 评论 (0)编辑 收藏

好久沒有接觸公司的程序啦, 因為一直沒出現問題所有也懶得理它,
可能是太長時間沒弄它啦, 今天上午一個小問題 居然發了我兩個小時
posted @ 2005-08-30 21:42 konhon 优华 阅读(249) | 评论 (0)编辑 收藏

可以用JDK中自帶的native2ascii.exe得到.
在命令提示符下輸入: native2ascii後, 然後再輸入漢字, 就可得到所要漢的Unicode.

汉字=Unicode
零=#38646
壹=#22777
贰=#36144
叁=#21441
肆=#32902
伍=#20237
陆=#38470
柒=#26578
捌=#25420
玖=#29590
拾=#25342
佰=#20336
仟=#20191
万=#19975
拾=#25342
佰=#20336
仟=#20191
亿=#20159
整=#25972
负=#36127
分=#20998
角=#35282
元=#20803
posted @ 2005-08-30 19:07 konhon 优华 阅读(305) | 评论 (0)编辑 收藏

function TForm1.ExtractString(const aString: string; const aSeparator: char; var aPos: Integer): string;
var
  I: Integer;
begin
  I := aPos;
  while (I <= Length(aString)) and (aString[I] <> aSeparator) do Inc(I);
  Result := Trim(Copy(aString, aPos, I - aPos));
  if (I <= Length(aString)) and (aString[I] = aSeparator) then Inc(I);
  aPos := I;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  lString, lSubString: string;
  lPos, j: integer;
begin
  lString := '023842394201342|343242423423|342342424|533423|2455';
  lPos := 1;
  j := 0;

  while lPos <= Length(lString) do
  begin
    lSubString := ExtractString(lString, '|', lPos);
    inc(j);
    if j = 2 then    // 第二個
      showmessage(lSubString);
  end;
end;

posted @ 2005-08-29 19:21 konhon 优华 阅读(709) | 评论 (0)编辑 收藏

仅列出标题
共21页: First 上一页 13 14 15 16 17 18 19 20 21 下一页