在 Java 物件導向程式設計中, 一直存在一個很重要的主角, 那就是 Java 資料物件, 這類物件主要是作為資料的容器 (PO : Persistent Object) 或載具 (DTO : Data transfer object ).
在本文中, 先來認識 POJO (Plain Old Java Object) 這簡易資料物件規範, POJO 資料物件只有變數 (Field) 及 getter、setter 這二個方法, 不具有永久儲存性.
如下程式範例中, 共宣告二個變數 (Field), 每一個變數均擁有 getter、setter 這二個方法. 變數均必須宣告 private, getter、setter 這二個方法一定要宣告 public, 這樣的程式設計又稱為 Information hiding
Mongo.java
public class Mongo {
private String type;
private String company;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
}
Mongo 資料物件的使用, 程式範例如下 :
MongoTest.java
public class MongoTest {
public static void main(String[] args) {
Mongo x = new Mongo();
x.setCompany("Donzai");
x.setType("Trolling");
System.out.println(x.getCompany());
System.out.println(x.getType());
}
}
先產生 Mongo 資料物件, 然後呼叫 setCompany() 及 setType() 這二個方法, 去設定 Mongo 資料物件內容. 然後再呼叫 getCompany() 及 getType() 這二個方法, 去顯示 Mongo 資料物件內容
2011年7月20日 星期三
2011年7月18日 星期一
Java Bean 的 XML 資訊檔
使用 java.beans 套件中的 XMLEncoder 及 XMLDecoder 這二個類別程式, 轉換 Java 物件資料 (Field) 與 XML 資訊檔
1. 程式撰寫
BeanEncoder.java
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class BeanEncoder {
public static void main(String[] args) {
Address address = new Address("123 Main Street", "San Jose", "CA", "95000-0000");
Contact contact = new Contact("Doe", "Joe", address);
try {
FileOutputStream fos = new java.io.FileOutputStream(args[0]);
java.beans.XMLEncoder encoder = new java.beans.XMLEncoder(fos);
encoder.writeObject(contact);
encoder.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
BeanDecoder.java
public class BeanDecoder {
public static void main(String[] args) {
java.io.FileInputStream fis;
try {
fis = new java.io.FileInputStream(args[0]);
java.beans.XMLDecoder decoder = new java.beans.XMLDecoder(fis);
Contact contact = (Contact) decoder.readObject();
decoder.close();
(new XMLWriter()).write(contact, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 執行程式
> java BeanEncoder d:\temp\abc.xml
執行後會在 d:\temp 目錄產生 abc.xml 資訊檔
> java BeanDecoder d:\temp\abc.xml
<?xml version = "1.0" encoding = "UTF-8"?><contact><name><fname>Doe</fname><lname>Joe</lname></name><address><street>123 Main Street</street><city>San Jose</city><state>CA</state><zip>95000-0000</zip></address></contact>
1. 程式撰寫
BeanEncoder.java
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class BeanEncoder {
public static void main(String[] args) {
Address address = new Address("123 Main Street", "San Jose", "CA", "95000-0000");
Contact contact = new Contact("Doe", "Joe", address);
try {
FileOutputStream fos = new java.io.FileOutputStream(args[0]);
java.beans.XMLEncoder encoder = new java.beans.XMLEncoder(fos);
encoder.writeObject(contact);
encoder.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
BeanDecoder.java
public class BeanDecoder {
public static void main(String[] args) {
java.io.FileInputStream fis;
try {
fis = new java.io.FileInputStream(args[0]);
java.beans.XMLDecoder decoder = new java.beans.XMLDecoder(fis);
Contact contact = (Contact) decoder.readObject();
decoder.close();
(new XMLWriter()).write(contact, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 執行程式
> java BeanEncoder d:\temp\abc.xml
執行後會在 d:\temp 目錄產生 abc.xml 資訊檔
> java BeanDecoder d:\temp\abc.xml
<?xml version = "1.0" encoding = "UTF-8"?><contact><name><fname>Doe</fname><lname>Joe</lname></name><address><street>123 Main Street</street><city>San Jose</city><state>CA</state><zip>95000-0000</zip></address></contact>
2011年7月17日 星期日
認識 JSF 網站開發架構
JavaServer Faces 於 2004 年三月 1.0 版正式提出,清楚的將 Web 2.0 網站的開發者劃分了三個角色:
1. 網頁設計人員
2. 應用程式設計人員
3. 網頁互動元件開發人員
從使用的角度 來看,網頁設計人員與應用程式設計人員可以他們所熟悉的方式開發程式,而不用侵入彼此的工作範圍,而網頁互動元件開發人員可以獨立的開發個別元件,細節的部份 留給了他們來處理。
總而言之,JavaServer Faces 協助了職責的分別,讓不同屬性的開發人員可以彼此合作,而又互不侵擾,網頁互動 (UI) 元件的開發搭配整合開發環境(IDE)或是所視即可得的網頁編輯程式,讓 Web 2.0 網站的開發得以簡單且迅速,藉此提高應用程式開發效率。
JavaServer Faces 2 (JSF 2) 是以 Java EE 為基礎的網頁互動 (UI) 應用架構技術,符合 MVC 架構,設定上跟其他架構相比算是較簡單些,也改進了第一代 JSF 的一些不足,Annotation 取代了原本的 xml 設定檔,使得設定相當容易,同時也提供彈性不錯的 Ajax 標籤。
參考文章
1.JSF 學習筆記
http://caterpillar.onlyfun.net/Gossip/JSF/JavaServerFaces.htm
2.Rational Application Developer for WebSphere Software V8 Programming Guide
http://my.safaribooksonline.com/book/-/0738435597/firstchapter
3.Apache MyFaces
http://myfaces.apache.org/
4. Why can't I get a larger heap with the 32-bit JVM?
http://www.oracle.com/technetwork/java/hotspotfaq-138619.html
5. How do you merge multiple VMware 2GB disk files to single monolithic vmdk file?
JSF 官方網址 : http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html
1. 網頁設計人員
2. 應用程式設計人員
3. 網頁互動元件開發人員
從使用的角度 來看,網頁設計人員與應用程式設計人員可以他們所熟悉的方式開發程式,而不用侵入彼此的工作範圍,而網頁互動元件開發人員可以獨立的開發個別元件,細節的部份 留給了他們來處理。
總而言之,JavaServer Faces 協助了職責的分別,讓不同屬性的開發人員可以彼此合作,而又互不侵擾,網頁互動 (UI) 元件的開發搭配整合開發環境(IDE)或是所視即可得的網頁編輯程式,讓 Web 2.0 網站的開發得以簡單且迅速,藉此提高應用程式開發效率。
JavaServer Faces 2 (JSF 2) 是以 Java EE 為基礎的網頁互動 (UI) 應用架構技術,符合 MVC 架構,設定上跟其他架構相比算是較簡單些,也改進了第一代 JSF 的一些不足,Annotation 取代了原本的 xml 設定檔,使得設定相當容易,同時也提供彈性不錯的 Ajax 標籤。
參考文章
1.JSF 學習筆記
http://caterpillar.onlyfun.net/Gossip/JSF/JavaServerFaces.htm
2.Rational Application Developer for WebSphere Software V8 Programming Guide
http://my.safaribooksonline.com/book/-/0738435597/firstchapter
3.Apache MyFaces
http://myfaces.apache.org/
4. Why can't I get a larger heap with the 32-bit JVM?
http://www.oracle.com/technetwork/java/hotspotfaq-138619.html
5. How do you merge multiple VMware 2GB disk files to single monolithic vmdk file?
JSF 官方網址 : http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html
2011年7月13日 星期三
Java 文字終端機 - 密碼輸入 (會出現 *)
Java 對於文字終端機的支援是非常貧乏, 例如 : 密碼輸入螢幕上只出現 '*', 這樣的功能, JDK 並沒有支援, 如需這樣的功能, 你必須使用第三方套件來完成.
在此為你介紹 Jline 這套件, 如何完成 密碼輸入螢幕上只會出現 '*',
實作步驟如下 :
1. 下載 JLine 套件
http://sourceforge.net/projects/jline/files/
2. 撰寫程式
import jline.*;
import java.io.*;
public class PasswordReader {
public static void main(String[] args) throws IOException {
ConsoleReader reader = new ConsoleReader();
String line = null;
do {
line = reader.readLine("enter password> ", '*');
System.out.println("Got password: " + line);
} while(line != null && line.length() > 0);
}
}
3.編譯程式
> javac -cp jline-1.0.jar PasswordReader
4. 執行程式
> java -cp .;jline-1.0.jar PasswordReader
enter password> **********
Got password: qqqqqqqqqq
enter password>
Got password:
JLine 官方網址 : http://jline.sourceforge.net/
在此為你介紹 Jline 這套件, 如何完成 密碼輸入螢幕上只會出現 '*',
實作步驟如下 :
1. 下載 JLine 套件
http://sourceforge.net/projects/jline/files/
2. 撰寫程式
import jline.*;
import java.io.*;
public class PasswordReader {
public static void main(String[] args) throws IOException {
ConsoleReader reader = new ConsoleReader();
String line = null;
do {
line = reader.readLine("enter password> ", '*');
System.out.println("Got password: " + line);
} while(line != null && line.length() > 0);
}
}
3.編譯程式
> javac -cp jline-1.0.jar PasswordReader
4. 執行程式
> java -cp .;jline-1.0.jar PasswordReader
enter password> **********
Got password: qqqqqqqqqq
enter password>
Got password:
JLine 官方網址 : http://jline.sourceforge.net/
2011年7月10日 星期日
Java 與 費式數列 (Fibonacci)
Fibonacci 為1200年代的歐洲數學家,在他的著作中曾經提到:「若有一隻免子每個月生一隻小免子,一個月後小免子也開始生產。起初只有一隻免 子,一個月後就有兩隻免子,二個月後有三隻免子,三個月後有五隻免子(小免子投入生產)......」。
範例程式
參考網站 : http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/FibonacciNumber.htm
範例程式
public class Fibonacci { public static void main(String[] args) { int[] fib = new int[20]; fib[1] = 1; for(int i = 2; i < fib.length; i++) fib[i] = fib[i-1] + fib[i-2]; for(int number : fib) System.out.print(number + " ");
System.out.println(); } }
參考網站 : http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/FibonacciNumber.htm
2011年7月9日 星期六
Java 浮點數內部格式
Java 浮點數內部格式採用 IEEE 754 二進位浮點數算術標準
浮點數而又分為單精度 (float) 與倍精度 (double) :單精度為 32bits,倍精度為 64bits
float 變數內部格式
double 變數內部格式
例如 : -12.625 使用 IEEE 754 單精度 表示浮點數
第一步驟:不管正負號直接將數值轉為二進制
12.625 => 1100.101 = 1.100101 × 2^3
第二步驟:計算指數
127+3=130 => 10000010
第三步驟:填入數值置於浮點數規格中
S E M
1 10000010 100101 0000 0000 0000 0000 0
撰寫研究程式 1 - MyIEEE754.java
public class MyIEEE754 {
public static void main(String[] args) {
System.out.println(Integer.toHexString(Float.floatToRawIntBits(2.25f)));
System.out.println(Integer.toHexString(Float.floatToRawIntBits(5.625f)))
}
}
程式中 Float.floatToRawIntBits(2.25f) 會將 float 浮點數內部格式, 以 int 傳回, 然後以十六進位格式顯示, 以下為執行結果 :
執行結果, 使用下圖為你解釋 :
1. 先計算指數部份 : 128-127=1 (如是 double, 則減去 1023)
2. 移動小數點 : 指數為正數 1, 所以向右移動一位
3. 計算整數 : 小數點左邊為 10 (二進位), 2*1+2*0 = 2
4. 計算小數 : 查表得知 小數點右邊 01 (二進位) 為 0.25
5. 將整數加上小數得到結果 : 2 + 0.25 = 2.25
撰寫研究程式 2 - MyIEEE754_2.java
public class MyIEEE754_2 {
public static void main(String[] args) {
System.out.println(Float.toHexString(1.0f));
System.out.println(Float.toHexString(5.25f));
System.out.println(Float.toHexString(0.625f));
System.out.println(Float.toHexString(5.3f));
System.out.println(Float.toHexString(-5.25f));
}
}
以下為執行結果 :
0x1.0p0
0x1.5p2
0x1.4p-1
0x1.533334p2
-0x1.5p2
浮點數而又分為單精度 (float) 與倍精度 (double) :單精度為 32bits,倍精度為 64bits
float 變數內部格式
double 變數內部格式
例如 : -12.625 使用 IEEE 754 單精度 表示浮點數
第一步驟:不管正負號直接將數值轉為二進制
12.625 => 1100.101 = 1.100101 × 2^3
第二步驟:計算指數
127+3=130 => 10000010
第三步驟:填入數值置於浮點數規格中
S E M
1 10000010 100101 0000 0000 0000 0000 0
撰寫研究程式 1 - MyIEEE754.java
public class MyIEEE754 {
public static void main(String[] args) {
System.out.println(Integer.toHexString(Float.floatToRawIntBits(2.25f)));
System.out.println(Integer.toHexString(Float.floatToRawIntBits(5.625f)))
}
}
程式中 Float.floatToRawIntBits(2.25f) 會將 float 浮點數內部格式, 以 int 傳回, 然後以十六進位格式顯示, 以下為執行結果 :
40100000
40b40000
40b40000
執行結果, 使用下圖為你解釋 :
1. 先計算指數部份 : 128-127=1 (如是 double, 則減去 1023)
2. 移動小數點 : 指數為正數 1, 所以向右移動一位
3. 計算整數 : 小數點左邊為 10 (二進位), 2*1+2*0 = 2
4. 計算小數 : 查表得知 小數點右邊 01 (二進位) 為 0.25
5. 將整數加上小數得到結果 : 2 + 0.25 = 2.25
撰寫研究程式 2 - MyIEEE754_2.java
public class MyIEEE754_2 {
public static void main(String[] args) {
System.out.println(Float.toHexString(1.0f));
System.out.println(Float.toHexString(5.25f));
System.out.println(Float.toHexString(0.625f));
System.out.println(Float.toHexString(5.3f));
System.out.println(Float.toHexString(-5.25f));
}
}
以下為執行結果 :
0x1.0p0
0x1.5p2
0x1.4p-1
0x1.533334p2
-0x1.5p2
2011年7月6日 星期三
一級憤怒 - jAG105
class MyBug06 {
public static void main(String[] arg) {
for(int i=0; true ; ++i)
System.out.println(i);
System.out.print('end');
}
}
這簡單程式, 幾個 "編譯憤怒" ?
public static void main(String[] arg) {
for(int i=0; true ; ++i)
System.out.println(i);
System.out.print('end');
}
}
這簡單程式, 幾個 "編譯憤怒" ?
一級憤怒 - jAG104
public class MyBug09 {
public static void main(String[] args){
byte o = 200;
for(int x=2;x<7;x++){
if(x==5) break v;
o=o+x;
}
v:
System.out.println(o);
}
}
這簡單程式, 幾個 "編譯憤怒" ?
public static void main(String[] args){
byte o = 200;
for(int x=2;x<7;x++){
if(x==5) break v;
o=o+x;
}
v:
System.out.println(o);
}
}
這簡單程式, 幾個 "編譯憤怒" ?
訂閱:
文章 (Atom)