推 joe7226107:推 01/03 23:37
※ 引述《henry4343 (henry)》之銘言:
: 請問一下各位,關於static method的使用時機為何?
: 以下兩個例子
: 1. Book.openBook();
: 2. Book book = new Book();
: book.openBook();
: openBook(){
: system.out.println("open book");
: }
: 其實作的事情都一樣,請問一下什麼情況下會用1,什麼情況下會用2呢
: 對我來說..我想偷懶的時候就會1(少打一點字...)
: 但還是希望搞懂這兩種方法到底該怎麼使用比較好?
: 感謝各位
提供參考一下
我自己是用 人事時地物(或是用4W1H也可以)的原則判別
其實主要是釐清該函式應該歸屬於何方
例如以你的例子來說
void openBook(){
System.out.println("open book");
}
這個函式
人:
事:只有列印"open book"
時:
地:
物:沒有輸入也沒有輸出也沒有異動
所以完全沒差
以下是我自己定義不同的狀況
openBook(){
開啟書本物件並且開始進行初始化
如果檔案沒有 格式不對 或...則丟出錯誤
}
事:看起來就有點複雜了
時:應該要乎叫或是使用book物件要第一個呼叫的函式
地:要呼叫的book物件在哪裡呢?
物:需要參數來找到書本物件呢?有必要回傳嗎?
在java之上 大膽假設一下
我認為這個函式所要使用的東東應該是跟這個函式在一起,既然在一起就不用回傳什麼啦
因此就是Book裡面啦
所以我草草寫一下
class Book{
String bookpath;
String context;
public Book(String bookpath){
this.bookpath=bookpath;
}
void openBook(){
//我認為書本應該是某個檔案
check(bookpath);
//讀取內容
context=readfromPath(bookpath);
//檢查內容
checkContext(context);
}
}
class TestBook{
public void testA(){
Book bookA=new Book("/book/book.txt");
bookA.openBook();
}
}
在這裡我認為openBook是應該在物件範圍內的
當然我也可以反之
我現在有一個Book類別,但是根據某種理由(因為我爽)
所以我不希望別人可以任意去new Book但是我又要提供Book物件給人家
然後我又懶得寫
所以我想(因為什麼都是我想就對啦-->需求)
提供一個叫openBook的函式給人家就好啦
事:建構一個Book物件
地:....
物:根據輸入的書本路徑 回傳一個Book物件給人家
Book openBook(String bookpath){
Book book=new Book(bookpath);
return book;
}
那麼在這裡可以發現到所牽扯到的物件似乎都不在openBook的同一個範圍
而且看起來也不需要靠某物件就可以運作
則
class BookFactory{
public static Book openBook(String bookpath){
return new Book(bookpath);
}
}
另外還有concurrence的問題 其實就是在平行運算的環境的問題 也會是
就是編譯過 單一測試也過 但多執行緒環境有問題 或有奇怪的bug
原因就是對於static 不當的使用
在此提供參考
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.29.29.131