#
下一個步驟是找出程序中對于舊函數(shù)的所有引用(reference)點,并修改它們,讓它們改用新函數(shù). 下面是原本的程序:
class Customer...
public String statement() {
double totalAmount = 0;
int frequentRenterPoints = 0;
Enumeration rentals = _rentals.elements();
String result = "Rental Record for * " + getName() + "\n";
while(rentals.hasMoreElements()) {
double thisAmount = 0;
Rental each = (Rental)rentals.nextElement(); //取得一筆租借記錄
thisAmount = amountFor(each);
// add frequent renter points(累加常客積點)
frequentRenterPoints ++;
if((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
each.getDaysRented() > 1)
frequentRenterPoints ++;
result += "\t" + each.getMovie().getTitle() + "\t" +
String.valueOf(thisAmount) + "\n";
totalAmount += thisAmount;
}
// add footer lines(結(jié)尾打印)
result += "Amount owed is " + String.valueOf(totalAmount) + " \n";
result += "You earned " + String.valueOf(frequentRenterPoints) +
"frequent renter points";
return result;
}
本例之中,這個步驟很簡單,因為我才剛剛產(chǎn)生新函數(shù),只有一個地方使用了它.一般情況下你得在可能運用該函數(shù)的所有classes中查找一遍.
class Customer
public String statement() {
double totalAmount = 0;
int frequentRenterPoints = 0;
Enumeration rentals = _rentals.elements();
String result = "Rental Record for * " + getName() + "\n";
while(rentals.hasMoreElements()) {
double thisAmount = 0;
Rental each = (Rental)rentals.nextElement(); //取得一筆租借記錄
thisAmount = each.getCharge();
// add frequent renter points(累加常客積點)
frequentRenterPoints ++;
if((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
each.getDaysRented() > 1)
frequentRenterPoints ++;
result += "\t" + each.getMovie().getTitle() + "\t" +
String.valueOf(thisAmount) + "\n";
totalAmount += thisAmount;
}
// add footer lines(結(jié)尾打印)
result += "Amount owed is " + String.valueOf(totalAmount) + " \n";
result += "You earned " + String.valueOf(frequentRenterPoints) +
"frequent renter points";
return result;
}
搬移[金額計算]代碼
觀察amountFor()時,我發(fā)現(xiàn)這個函數(shù)使用了來自Rental class的信息,卻沒有使用來自Customer class的信息.
class Customer...
public double amountFor(Rental aRental) {
double result = 0;
switch(aRental.getMovie().getPriceCode()) { //取得影片出租價格
case Movie.REGULAR: //普通片
result+= 2;
if(aRental.getDaysRented() > 2)
result+= (aRental.getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE: //新片
result+= aRental.getDaysRented() * 3;
break;
case Movie.CHILDRENS: //兒童片
result+= 1.5;
if(aRental.getDaysRented() > 3)
result+= (aRental.getDaysRented() - 3) * 1.5;
break;
}
return result;
}
這立刻使我懷疑它是否被放錯了位置.大多數(shù)情況下,函數(shù)應(yīng)該放在它使用的數(shù)據(jù)的所屬object(或說class)內(nèi),所以amountFor()應(yīng)該移
到Rental class去.為了這么做,我要運用Move Method(142).首先把代碼拷貝到Rental
class內(nèi),調(diào)整代碼使之適應(yīng)新家,然后重新編譯.下面這樣:
class Rental...
double getCharge() {
double result = 0;
switch(getMovie().getPriceCode()) { //取得影片出租價格
case Movie.REGULAR: //普通片
result+= 2;
if(getDaysRented() > 2)
result+= (getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE: //新片
result+= getDaysRented() * 3;
break;
case Movie.CHILDRENS: //兒童片
result+= 1.5;
if(getDaysRented() > 3)
result+= (getDaysRented() - 3) * 1.5;
break;
}
return result;
}
這個例子里,[適應(yīng)新家]意味去掉參數(shù).此外,我還要在搬移的同時變更函數(shù)名稱.
現(xiàn)在我可以測試新函數(shù)是否正常工作.只要改變Customer.amountFor()函數(shù)內(nèi)容,使它委托(delegate)新函數(shù)即可:
class Customer...
private double amountFor(Rental aRental) {
return aRental.getCharge();
}
實例代碼:
public String statement() {
double totalAmount = 0;
int frequentRenterPoints = 0;
Enumeration rentals = _rentals.elements();
String result = "Rental Record for * " + getName() + "\n";
while(rentals.hasMoreElements()) {
double thisAmount = 0;
Rental each = (Rental)rentals.nextElement(); //取得一筆租借記錄
switch(each.getMovie().getPriceCode()) { //取得影片出租價格
case Movie.REGULAR: //普通片
thisAmount += 2;
if(each.getDaysRented() > 2)
thisAmount += (each.getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE: //新片
thisAmount += each.getDaysRented() * 3;
break;
case Movie.CHILDRENS: //兒童片
thisAmount += 1.5;
if(each.getDaysRented() > 3)
thisAmount += (each.getDaysRented() - 3) * 1.5;
break;
}
// add frequent renter points(累加常客積點)
frequentRenterPoints ++;
if((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
each.getDaysRented() > 1)
frequentRenterPoints ++;
result += "\t" + each.getMovie().getTitle() + "\t" +
String.valueOf(thisAmount) + "\n";
totalAmount += thisAmount;
}
// add footer lines(結(jié)尾打印)
result += "Amount owed is " + String.valueOf(totalAmount) + " \n";
result += "You earned " + String.valueOf(frequentRenterPoints) +
"frequent renter points";
return result;
}
第一步驟是找出代碼的邏輯泥團并運用Extract Method(110).本例一個明顯的邏輯泥團就是switch語句,把它提煉(extract)到獨立函數(shù)中似乎比較好.
首先我得在這段代碼里頭找出函數(shù)內(nèi)的局部變量(local
variables)和參數(shù)(parameters).我找到了兩個:each和thisAmount,前者并未被修改,后者會被修改.任何不會被修改的
變量都可以被我當成參數(shù)傳入新的函數(shù),至于會被修改的變量就需格外小心.如果只有一個變量會被修改,我可以把它當作返回值.thisAmount是個臨時
變量,其值在每次循環(huán)起始處被設(shè)為0,并且在switch語句之前不會改變,所以我可以把新函數(shù)的返回值賦予它.
public String statement() {
double totalAmount = 0;
int frequentRenterPoints = 0;
Enumeration rentals = _rentals.elements();
String result = "Rental Record for * " + getName() + "\n";
while(rentals.hasMoreElements()) {
double thisAmount = 0;
Rental each = (Rental)rentals.nextElement(); //取得一筆租借記錄
thisAmount = amountFor(each);
// add frequent renter points(累加常客積點)
frequentRenterPoints ++;
if((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
each.getDaysRented() > 1)
frequentRenterPoints ++;
result += "\t" + each.getMovie().getTitle() + "\t" +
String.valueOf(thisAmount) + "\n";
totalAmount += thisAmount;
}
// add footer lines(結(jié)尾打印)
result += "Amount owed is " + String.valueOf(totalAmount) + " \n";
result += "You earned " + String.valueOf(frequentRenterPoints) +
"frequent renter points";
return result;
}
public double amountFor(Rental each) {
double thisAmount = 0;
switch(each.getMovie().getPriceCode()) { //取得影片出租價格
case Movie.REGULAR: //普通片
thisAmount += 2;
if(each.getDaysRented() > 2)
thisAmount += (each.getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE: //新片
thisAmount += each.getDaysRented() * 3;
break;
case Movie.CHILDRENS: //兒童片
thisAmount += 1.5;
if(each.getDaysRented() > 3)
thisAmount += (each.getDaysRented() - 3) * 1.5;
break;
}
return thisAmount;
}
現(xiàn)在,已經(jīng)把原本的函數(shù)分為兩塊,可以分別處理它們.我不喜歡amountFor()內(nèi)的某些變量名稱,現(xiàn)在是修改它們的時候.
下面是原本的代碼:
public double amountFor(Rental each) {
double thisAmount = 0;
switch(each.getMovie().getPriceCode()) { //取得影片出租價格
case Movie.REGULAR: //普通片
thisAmount += 2;
if(each.getDaysRented() > 2)
thisAmount += (each.getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE: //新片
thisAmount += each.getDaysRented() * 3;
break;
case Movie.CHILDRENS: //兒童片
thisAmount += 1.5;
if(each.getDaysRented() > 3)
thisAmount += (each.getDaysRented() - 3) * 1.5;
break;
}
return thisAmount;
}
下面是易名后的代碼:
public double amountFor(Rental aRental) {
double result = 0;
switch(aRental.getMovie().getPriceCode()) { //取得影片出租價格
case Movie.REGULAR: //普通片
result += 2;
if(aRental.getDaysRented() > 2)
result += (aRental.getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE: //新片
result += aRental.getDaysRented() * 3;
break;
case Movie.CHILDRENS: //兒童片
result += 1.5;
if(aRental.getDaysRented() > 3)
result += (aRental.getDaysRented() - 3) * 1.5;
break;
}
return result;
}
1.邏輯泥團(logical clump),這里是指類似下面的邏輯混在一起的代碼:
...
switch(each.getMovie().getPriceCode()) {
case Movie.REGULAR:
thisAmount += 2;
.....
case Movie.CHILDRENDS:
thisAmount += 1.5;
if(each.getDaysRented() > 3)
thisAmount += (each.getDaysRented() - 3)*1.5;
break;
}
...
2.重構(gòu)名錄(refactoring catalog)是指常用的重構(gòu)方法列出的名錄.
快速而隨性地(quick and dirty)地設(shè)計一個簡單的程序并沒有錯.
1.首先,把windows的simsun.ttc文件考到指定目錄,重命名為simsun.ttf.
2.注冊字體:到JAVA_HOME下的jre/lib/fonts下.編輯fonts.dir.具體如下:第一行的數(shù)字加一.在最后一行加入一句:
simsun.ttf -default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
可選字體的還有:
simsun.ttf -SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
simsun.ttf
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1
3.修改JAVA_HOME下的jre/lib/的font.properties文件(這里的font.properties文件最好做備份). ($cp -v font.properties.zh_CN.Sun font.properties)
修改的地方有三處:
A.類似如下的 serif.0=-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1
serif.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0
看到xxxx.1=后面的字體全部改成已經(jīng)注冊的字體.
B.類似如下的 fontset.serif.plain=\
-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0
fontset.serif.plain=\后的第二行字體全部改成注冊的字體.
C.最后一行:appendedfontpath=/usr/share/fonts/truetype.這里的/usr/share/fonts/truetype是simsun.ttf的考到的目錄名.
具體文件如下:
# @(#)font.properties.zh_CN.Sun.linux 1.1 03/07/14
# Copyright 2003 Sun Microsystems, Inc. All rights reserved.
#
# Component Font Mappings For Linux zh_CN
#
serif.0=-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1
serif.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
serif.italic.0=-b&h-lucidabright-medium-i-normal--*-%d-*-*-p-*-iso8859-1
serif.italic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
serif.bold.0=-b&h-lucidabright-demibold-r-normal--*-%d-*-*-p-*-iso8859-1
serif.bold.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
serif.bolditalic.0=-b&h-lucidabright-demibold-i-normal--*-%d-*-*-p-*-iso8859-1
serif.bolditalic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
sansserif.0=-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1
sansserif.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
sansserif.italic.0=-b&h-lucidasans-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1
sansserif.italic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
sansserif.bold.0=-b&h-lucidasans-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1
sansserif.bold.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
sansserif.bolditalic.0=-b&h-lucidasans-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1
sansserif.bolditalic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
monospaced.0=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1
monospaced.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
monospaced.italic.0=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1
monospaced.italic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
monospaced.bold.0=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1
monospaced.bold.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
monospaced.bolditalic.0=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1
monospaced.bolditalic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
dialog.0=-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1
dialog.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
dialog.italic.0=-b&h-lucidasans-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1
dialog.italic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
dialog.bold.0=-b&h-lucidasans-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1
dialog.bold.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
dialog.bolditalic.0=-b&h-lucidasans-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1
dialog.bolditalic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
dialoginput.0=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1
dialoginput.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
dialoginput.italic.0=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1
dialoginput.italic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
dialoginput.bold.0=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1
dialoginput.bold.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
dialoginput.bolditalic.0=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1
dialoginput.bolditalic.1=-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
# Missing Glyph Character
#
default.char=274f
# Component Font Character Encodings
#
fontcharset.serif.0=sun.io.CharToByteISO8859_1
fontcharset.serif.1=sun.io.CharToByteGBK
fontcharset.sansserif.0=sun.io.CharToByteISO8859_1
fontcharset.sansserif.1=sun.io.CharToByteGBK
fontcharset.monospaced.0=sun.io.CharToByteISO8859_1
fontcharset.monospaced.1=sun.io.CharToByteGBK
fontcharset.dialog.0=sun.io.CharToByteISO8859_1
fontcharset.dialog.1=sun.io.CharToByteGBK
fontcharset.dialoginput.0=sun.io.CharToByteISO8859_1
fontcharset.dialoginput.1=sun.io.CharToByteGBK
# Exclusion Ranges
#
# XFontSet Information
#
fontset.serif.plain=\
-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.serif.italic=\
-b&h-lucidabright-medium-i-normal--*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.serif.bold=\
-b&h-lucidabright-demibold-r-normal--*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.serif.bolditalic=\
-b&h-lucidabright-demibold-i-normal--*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.sansserif.plain=\
-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.sansserif.italic=\
-b&h-lucidasans-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.sansserif.bold=\
-b&h-lucidasans-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.sansserif.bolditalic=\
-b&h-lucidasans-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.monospaced.plain=\
-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.monospaced.italic=\
-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.monospaced.bold=\
-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.monospaced.bolditalic=\
-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.dialog.italic=\
-b&h-lucidasans-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.dialog.bold=\
-b&h-lucidasans-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.dialog.bolditalic=\
-b&h-lucidasans-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.dialog.plain=\
-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.dialoginput.italic=\
-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.dialoginput.bold=\
-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.dialoginput.bolditalic=\
-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.dialoginput.plain=\
-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
fontset.default=\
-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.
filename.-default-simsun-medium-r-normal--*-100-*-*-c-*-gb2312.1980-0.=/usr/share/fonts/truetype/simsun.ttf
appendedfontpath=/usr/share/fonts/truetype
public class ReaderInputStream extends InputStream {
protected Reader reader;
protected ByteArrayOutputStream byteArrayOut;
protected Writer writer;
protected char[] chars;
protected byte[] buffer;
protected int index, length;
/**
* 帶Reader參數(shù)構(gòu)造函數(shù)
*
* @param reader - InputStream使用的Reader
*/
public ReaderInputStream(Reader reader) {
this.reader = reader;
byteArrayOut = new ByteArrayOutputStream();
writer = new OutputStreamWriter(byteArrayOut);
chars = new char[1024];
}
/**
* 帶Reader和字符編碼格式參數(shù)的構(gòu)造函數(shù)
*
* @param reader - InputStream使用的Reader
* @param encoding - InputStream使用的字符編碼格式.
* @throws 如果字符編碼格式不支持,則拋UnsupportedEncodingException異常
*/
public ReaderInputStream(Reader reader, String encoding)
throws UnsupportedEncodingException {
this.reader = reader;
byteArrayOut = new ByteArrayOutputStream();
writer = new OutputStreamWriter(byteArrayOut, encoding);
chars = new char[1024];
}
/**
* @see java.io.InputStream#read()
*/
public int read() throws IOException {
if (index >= length)
fillBuffer();
if (index >= length)
return -1;
return 0xff & buffer[index++];
}
protected void fillBuffer() throws IOException {
if (length < 0)
return;
int numChars = reader.read(chars);
if (numChars < 0) {
length = -1;
} else {
byteArrayOut.reset();
writer.write(chars, 0, numChars);
writer.flush();
buffer = byteArrayOut.toByteArray();
length = buffer.length;
index = 0;
}
}
/**
* @see java.io.InputStream#read(byte[], int, int)
*/
public int read(byte[] data, int off, int len) throws IOException {
if (index >= length)
fillBuffer();
if (index >= length)
return -1;
int amount = Math.min(len, length - index);
System.arraycopy(buffer, index, data, off, amount);
index += amount;
return amount;
}
/**
* @see java.io.InputStream#available()
*/
public int available() throws IOException {
return (index < length) ? length - index :
((length >= 0) && reader.ready()) ? 1 : 0;
}
/**
* @see java.io.InputStream#close()
*/
public void close() throws IOException {
reader.close();
}
}
1. 啟動emacs.
2.打開jde-mode方式.
3.在打開jde-abbrev-mode方式.
然后輸入if,接著按空格鍵(輸入if的條件);展開if語句.
if(i == 0) {
} // end of if (i == 0)
表 1. Abbreviations 語句 | Abbreviation |
---|
if-then | if | else | else | if-then-else | ife | else-if | eif | while | while | for | for | for (int
I=0;I<UL;I++) | fori | for (Iterator i = c.iterator();
i.hasNext();) | foriter | main method | main | switch | switch | case | case | try | try | catch | catch | try finally | tryf | finally | finally |
首先,需打開jde模式.(M-x jde-mode)
在JDEE里注冊一個新的jdk:
打開emacs. 輸入 M-x customize-variable 并回車. Emacs 提示你要自定義的變量名. 輸入 jde-jdk-registry 并回車. jde-jdk-registry 的配置界面. 按 INS 按鈕. 顯示 JDK 項. 輸入JDK的版本號 和 JDK 的安裝路徑. 重復(fù)先前的步驟. 按 State 按鈕. State 菜單顯示. 選擇 Save for Future Sessions . NoteThis saves the setting of jde-jdk-registry
in your .emacs file. 按 Finish button保存.
選擇 JDK: 輸入 M-x customize-variable 并回車.
Emacs 提示你要自定義的變量. 輸入 jde-jdk 并回車. jde-jdk 的配置界面. 緩沖區(qū)里顯示注冊的jdk的列表. 按radio button 選擇你要使用的jdk. 按State 按鈕. State 菜單顯示. 選擇 Save for Future Sessions. 按 Finish 按鈕 保存設(shè)置.
我的java是jre1.4.2的.
首先是進入firefox的插件目錄.我的是~/.mozilla/plugins.
然后是確定jre的插件目錄.我的是~/programs/j2sdk1.4.2_08/jre/plugin/i386/ns610-gcc32.這里是使用gcc32的系統(tǒng).
最后是做連接.具體如下:
$cd ~/.mozilla/plugins
$ln -s ~/programs/j2sdk1.4.2_08/jre/plugin/i386/ns610-gcc32/libjavaplugin_oji.so
重起firefox,確定插件是否安裝成功.在firefox輸入about:plugins.有就成功了.
|