在Java程序中,類是其實現功能的核心。如果說開發Java應用程序,就是一個類的構建與使用的過程這一點都不為過。可惜的是,不少程序員在編寫類的時候,還是會犯一些常規的錯誤。筆者就對此做一個總結,望各位讀者能夠引起重視。
一、基本數據類型的初始化問題。
在Java語言中,跟其他開發語言一樣,都定義了一些基本的數據類型。程序員可以拿來直接使用,還可以用來構造其他一些復雜的應用程序。不過在Java中使用這些基本數據類型有些不同。在Java語言中,這個基本數據類型主要用在兩個地方,分別為類中的成員或者局部變量。對於這些基本的數據類型,常犯的錯誤就是沒有進行初始化。
如果將某些變量是屬於這些基本數據類型的,當他們作為一個類的成員使用時,默認情況下編譯器會給其一個默認值。以保證那些是基本類型的成員變量得到初始化,防止產生程序的錯誤。但是,這些默認的初始值大部分情況下可能都不符合程序員的需要,可能是不准確的,也可能是不合法的。為此筆者的建議是,開發人員要養成一個好習慣,在定義變量的時候(用於類成員),就最好明確的對變量進行初始化。另外需要注意的是,跟C++等編程語言相比,Java在這方面有了很不錯的改善。如如果開發人員忘記對其進行初始化,Java至少還會采用默認值對其進行初始化,來防止程序錯誤。但是在C++中,則不會對其進行自動初始化。在這種情況下,由於變量沒有及時初始化,而很容易出現程序的崩潰。
基本類型的另外一種用途就是當作局部變量來使用,如在循環語句中當作循環條件來使用。此時跟類成員不同,系統不會自動對局部變量進行初始化。很多程序開發員會在這裡栽跟頭。因為在類成員中會對其進行自動初始化,而在局部變量也如此。其實不然。當利用int y 等語句定義了一個局部變量時,Java跟其他開發語言一樣,是不會對其進行自動初始化的。開發人員需要在定義變量時就對其進行初始化,這是筆者強烈建議的。如果在代碼編譯的時候,局部變量沒有被正確的初始化,則系統編譯器就會返回一個錯誤信息,告訴開發人員某個局部變量沒有被正確的初始化,便以不會成功。在這方面,Java跟其他語言也有所不同。如在C++中,如果變量沒有初始化,那麼系統只是拋出一個警告信息,便以仍然可以正常進行。這無疑後以後程序運行埋下了一顆定時炸彈。為此筆者認為,Java這種做法是比較安全的。當局部變量沒有初始化時,系統會拒絕進行編譯,而不是簡單的只是一個警告信息。有時候,警告信息並不能夠引起程序開發人員的重視。
總之,基本數據類型無論是作為類成員變量來使用,還是作為局部變量來使用,程序開發人員都要養成一個好習慣,即在變量定義的時候馬上進行初始化。即使不知道還賦予什麼值合適,那麼最好也是手工的賦予其一個默認值。等到變量使用時,在根據實際情況給其重新賦值。無論什麼情況下,變量一定以就要對其進行初始化。
二、給方法設置合適的返回類型。
在Java類中,除了成員變量,最重要的就是方法了。而在方法中,比較容易出現問題的那就是其返回類型的問題。這裡指的返回類型是指調用方法後返回的數據類型。也就是說,在方法內部執行一系列的運算之後,要返回給外部的值。開發人員要根據這個值來設置方法的返回類型。如現在有一個方法age()。主要的用途就是根據身份證號碼來推算出這個人的年齡。此時在調用這個方法時,可利用如下的語句 int age1=getage.age()。
那麼在定義這個方法的時候,需要注意哪些內容呢?
首先在定義方法的時候,需要注意其數據的范圍類型。並不是說所有的方法都會返回結果。如果某個方法返回結果的話,並不是說不用指定返回的數據類型。仍然需要指定,只是利用關鍵字void,而不是采用int等基本數據類型。如假設上面這個age方法沒有返回任何的數據類型,則要按照如下的方法來定義,即void age()。注意前面的關鍵字void表示這個方法沒有返回值。如果有返回值的話,那麼就要在方法開頭指明返回值的類型。如age這個方法,如果其返回的是年齡整數型的數據,則就需要如下定義int age()。最好的情況是,返回的數據類型跟方法中指定的數據類型一致。,但是在實際工作中,沒有定義的這麼嚴格。一般來說,這個數據類型只要兼容機即可。如雖然返回的數據是整數,但是在方法處定義的可以是浮點數的數據類型。因為他們是兼容的。但是反過來則不行。如返回的值為浮點數,而在方法中定義的卻是整數型的返回值。此時系統就會認為是錯誤的。因為在整數型的變量中無法存儲浮點數的數據。
其次需要注意的是在調用這個方法時,需要將方法的返回值賦值給某個變量。為此,這個變量的數據類型必須同這個方法返回值的數據類型兼容。int age1=getage.age(),如在這個語句中,如果方法age返回的是整數型的數據,就說明是可行的。但假設這個方法返回的不是整數型的數據,而是浮點數的數據類型,那麼就會發生數據類型不兼容的情況。所以在將某個方法的返回值賦值給變量時,一定需要注意這個方法的返回值到底是什麼。如果這個方法是程序員自己編寫的,那麼一般不會出現問題。自己編寫的方法,應該清楚其會返回什麼樣的值。現在的問題是,如果這個方法不是程序員自己開發的呢?在一些大型的應用程序開發中,往往需要多個程序員合作才能夠完成一個項目。此時程序員就需要引用其他程序開發人員開發的類以及類中的方法。有時候程序開發人員還會從網上下載類直接拿來使用。無論是哪一種方式,都會涉及到這個數據類型的問題。為此如果是程序員自己開發的類供別人使用時,那麼最好能夠在類或者方法的說明中,將這個方法會返回的數據類型寫清楚,並且要確保准確。只有如此,程序員才能夠在引用某個方法時為其設置合適的數據類型,避免因為數據類型不一致而導致應用程序編譯或者運行錯誤。
三、參數列表的個數與數據類型。
在定義方法時,往往需要外部參入一些參數才能夠運行。如在根據身份證號碼來判斷年齡的方法中,至少需要將身份證號碼這個參數傳遞放方法對內部中去。有時候可能還不止一個參數。如由於身份證號碼新版與舊版是不同的。為此同時需要將身份證號碼的版本傳遞到方法裡面去。在這個傳遞的過程中,主要需要注意的就是參數的個數與數據類型。
如果外部需要傳入多個參數到方法內部的話,那麼在定義方法時就需要設置這麼多的參數,傳入的參數與參數列表中的參數必須一一對應。如上面這個案例中需要傳入身份證號碼與身份證的版本,那麼在定義這個方法的時候就需要設置兩個參數。
其次需要注意數據類型。在參數列表中,也需要為參數指定其采用的數據類型。這個數據類型必須與實際傳入的數據類型一致或者兼容。為了保證這一點,往往需要在傳入這個參數之間進行控制。如需要利用一個If語句來判斷傳入的參數是否符合要求。如果符合的話,調用這個方法。相反不符合的話,則會 拋出一個異常,並將錯誤信息返回給用戶。在大部分情況下,如果方法涉及到參數,利用if語句來進行判斷是比較合理的。另外,也可以事先利用數據類型轉換函數,強制將傳輸參數的數據類型轉換成參數列表所定義的數據類型。不過需要注意的是,在轉換過程中可能會造成一些數據的誤差。開發人員需要預先評估一下能否接受這誤差。如果可以接收的話,則可以采用這種方法來強制數據的兼容性。如果不行的話,則就需要給用戶返回錯誤信息,讓其提供一個合法的參數。
另外在窗口中進行類似的控制也是不錯的選擇。如可以通過必須填寫文本框這種機制來控制用戶必須傳入多少個參數。或者在文本框中采用列表或者日期型的選擇框等等來規范用戶傳入參數的數據類型。總之,這個方法傳入參數的控制,無論是數量上還是數據類型上,在越靠近用戶的那邊控制效果越好。如此用戶可以在最短的時間內發現問題,而不會等到程序執行錯誤了才知道自己提供的參數有問題。