顯示具有 java 標籤的文章。 顯示所有文章
顯示具有 java 標籤的文章。 顯示所有文章

2018年7月14日 星期六

java 跟 C# 在 anonymous inner class 中引用外部變數

在 java 中的 anonymous inner class 中引用外部變數時,需要該變數為 final 才能成功引用,這是因為在 java 中這樣的外部變數引用實際上是將變數 copy 一份副本並存在 inner class 中當作 object field 來使用的,這樣做的好處是 compiler 不需要下功夫建立出額外的 code 來讓 inner class 實際持有外部變數

瞭解了 java 引用外部變數的作法之後,試想若是能在 inner class 中將變數修改的話,看起來就會變得很奇怪了,這會讓人以為在 inner class 中的對外部變數的修改會在 inner class 外的 scope 生效,但所謂的引用只是副本,修改的也只是副本而已

既然如此,就乾脆定義只有 final 變數能被 inner class 引用,這樣就不能在 inner class 內修改變數,也不會讓人誤解

不過在 C# 中情況就不一樣了,C# 跟 java 的不同是 C# 為了開發便利,compiler 會幫你做很多事,在 C# 中 inner class 引用外部變數就真的是實際持有這個外部變數,在 inner class 中不但可以修改外部變數,而且修改後的結果在 inner class 外也可以真的看到

2017年9月27日 星期三

java blocking IO read 不支援 interrupt

一直以為 java 所有的 blocking operation 是可以用 thread.interrupt() method 中斷的,但是後來才發現  java 原本的 blocking IO library 是不支援 interrupt 的,例如去 read 一個 socket,然後用 thread.interrupt() 去中斷呼叫 read 的 thread,會發現 read 並沒有被中斷

新的 File library 像是 java.nio 才有支援 interrupt,而原本的 IO library 就要考慮其它的方式來中斷一個 blocking read,例如把 socket close,或是去 polling 是否 data available,若 data available 再呼叫 blocking read method

2016年7月4日 星期一

用 command line 跑 java 程式設定 jar library 的 class path

當 java 程式用到第三方 jar 檔時
用 IDE 執行程式不需要特別設定, IDE 會自動幫你設定好 class path
但是用 command line 執行時就需要自己指定好 class path

指定的語法很簡單
java -cp <class path> Program
class path 參數用分號隔開
並將用到的所有 jar 檔路徑放進去

ex:
java -cp "lib/a.jar;lib/b.jar;." MyProgram