關注的太多,似乎太累了。于是整理一下路線,在有空的時候關注:
web presentation Framework:
JSF ajax(Struts似乎沒有研究必要了,雖然早就用了好久,但是源碼沒有通讀過,現在看來還是觀望struts Ti后再說)
Spring
Hibernate
足夠了,不繼續累自己了……
posted @ 2005-12-05 15:47 BlueO2 閱讀(342) | 評論 (0) | 編輯 收藏
關注的太多,似乎太累了。于是整理一下路線,在有空的時候關注:
web presentation Framework:
JSF ajax(Struts似乎沒有研究必要了,雖然早就用了好久,但是源碼沒有通讀過,現在看來還是觀望struts Ti后再說)
Spring
Hibernate
足夠了,不繼續累自己了……
posted @ 2005-12-05 15:47 BlueO2 閱讀(342) | 評論 (0) | 編輯 收藏
http://bennolan.com/behaviour/ 為了避免在html中引入過多的script tag,尤其現在富客戶端應用很火的時候,script寫的就越發的多。
官方網站舉了一個這樣子的例子
<div id="image_16209134_normal">
<script language="Javascript">
photo_hash['16209134'] = new Object();
photo_hash['16209134'].title = '2am on Saturday';
</script>
<h4 id="title_div16209134"
style="margin-bottom: 0px; margin-top: 0px;">
2am on Saturday
</h4>
<script type="text/javascript">
initPhotosUserPageTitle_div('16209134');</script>
這是Flickr上面一段代碼。確實,它使得代碼閱讀起來結構不清晰了。Behavior應用之后,不需在元素上寫明觸發事件要執行的方法,比如
<a onclick="this.parentNode.removeChild(this)" href="#">
Click me to delete me
</a>
而變成了
<ul id="example">
<li>
<a href="/someurl">Click me to delete me</a>
</li>
</ul>
那么javascript如果找到這個a鏈接并加上onclick事件方法的呢?采用css selector
var myrules = {
'#example li' : function(el){
el.onclick = function(){
this.parentNode.removeChild(this);
} }};
Behaviour.register(myrules);
確實看起來,html清爽了,但是,卻引入了其他的元素。ok,我們可以為每個控件定義id,其實也未嘗不可,asp.net不也是web component開發的時候都定義id的么?可似乎又脫褲子放屁之嫌。在維護一個對某一組應用相同樣式或響應
相同方法的html控件上應用behavior,有意義,起碼不必每個上面都寫上onclick之類的,但是對于更普遍的應用,每個html控件要做得事情是不同的啊。那個時候,不但用behavior代碼量增加了,而且維護一個var myrules里的內容和去刪除控件上的onclick其實工作量差不多。真正的應用可不是demo啊,列出來一排link寫著remove me,然后執行一樣的動作。
不過正如我上面說的,還是有一定的應用場景的,大家可以在有此需求的時候考慮,還有一Behaviour.js
posted @ 2005-11-24 23:10 BlueO2 閱讀(961) | 評論 (1) | 編輯 收藏
posted @ 2005-11-24 00:21 BlueO2 閱讀(1585) | 評論 (1) | 編輯 收藏
posted @ 2005-11-09 22:56 BlueO2 閱讀(352) | 評論 (0) | 編輯 收藏
posted @ 2005-11-07 16:30 BlueO2 閱讀(417) | 評論 (0) | 編輯 收藏
posted @ 2005-10-09 22:50 BlueO2 閱讀(357) | 評論 (0) | 編輯 收藏
posted @ 2005-10-08 15:40 BlueO2 閱讀(524) | 評論 (0) | 編輯 收藏
posted @ 2005-10-08 12:13 BlueO2 閱讀(405) | 評論 (0) | 編輯 收藏
輸出結果:
---------- Run ----------
s1 s2 equal
strArray equal
strArray2 equal
Output completed (1 sec consumed) - Normal Termination
首先,各位應該明白最基礎的東西 ==實現的比較是淺比較,就是非reference指向的具體對象內容,而是是否指向了同一個對象。第二,String類型被設計為非可變類,就是說 String s1 = "hi";與String s2 = "hi";其實指向了同一個對象,只有用new構造函數的時候才會產生新的對象,而不管內容是否已經在內存中存在。如下文字闡述了一些:
s = new String("Initial Value");
每次都會調用構造器,生成新對象,性能低下且內存開銷大,并且沒有意義,因為String對象不可改變,所以對于內容相同的字符串,只要一個String對象來表示就可以了。也就說,多次調用上面的構造器創建多個對象,他們的String類型屬性s都指向同一個對象。
上面的結論還基于這樣一個事實:對于字符串常量,如果內容相同,Java認為它們代表同一個String對象。而用關鍵字new調用構造器,總是會創建一個新的對象,無論內容是否相同
ok,回到我們的話題上來String[] s2 = {"hi","hi","hi","hi","hi"};是否產生了5個不同的對象呢?我寫的簡單的測試代碼
String[] strArray2 = {"hello","hello"};
if(strArray2[0]==strArray2[1]) System.out.println("strArray2 equal");
的結果大家應該得出了結論了吧。
那么,bruce給出的代碼的結果之所以為true就是因為,這么多個數組中的成員"hi"其實都是同一個對象。那么我們繼續看Arrays.equals是否比較的內容呢?
SRC:
public static boolean equals(Object[] a, Object[] a2) {
if (a==a2)
return true; //如果指向同一對象,當然是相同的,返回true
if (a==null || a2==null)
return false; //如果為null就沒有相等的一說,false
int length = a.length;
if (a2.length != length) //長度不同
return false;
for (int i=0; i<length; i++) {
Object o1 = a[i];
Object o2 = a2[i];
if (!(o1==null ? o2==null : o1.equals(o2))) //此處為關鍵,object的equals比較,Arrays.equals并沒有專門為String類型重載此方法,全部都依賴Object的方法比較
return false;
}
return true;
}
那么我們再看看Object這個樹根的equals方法吧:
public boolean equals(Object obj) {
return (this == obj);
}
短短幾行代碼,但是,是淺比較毫無疑問,所以,bruce說的,依賴的是Object.equals,比較的是內容,更是錯誤的。
但是必須強調的是,當String數組傳遞進來的時候,由于java的RTTI執行期型別辨識,Arryas.equals調用的其實是String.equals方法,而String.equals方法是比較內容的,所以,此處我想是bruce沒有說明白,而又偏偏列舉了String的例子。如果是自己寫的類有沒有復寫equals方法,此時就調用Object.equals了,那么根本不可能比較內容,所以Arrays.equals大家一定要知道怎么回事再用。
posted @ 2005-10-08 12:05 BlueO2 閱讀(511) | 評論 (0) | 編輯 收藏
posts - 29, comments - 3, trackbacks - 0, articles - 0
Copyright © BlueO2