“java中全局變量應(yīng)該放哪兒? ”引發(fā)的爭論
1、單獨(dú)寫一個final的類,在里面定義final static的全局變量,在其它程序里包含進(jìn)來就可以了。
2、類中的任何static public的成員變量都是全局共享的。
3、JAVA中不應(yīng)該有所謂全局變量的概念,全局變量嚴(yán)重影響了封裝和模塊化,所以如果你的程序中需要所謂的全局變量,那一定是你對程序的設(shè)計出了問題。
4、那JAVA提供FINAL STATIC 干嗎用啊,存在即合理,很多情況是需要用到全局變量的。他能減少參數(shù)的傳遞,能避免重復(fù)聲明。
5、FINAL STATIC應(yīng)該理解為常量,而不是“全局變量”,它的目的不是為了讓你每個類都可以訪問,而是獨(dú)立于具體對象,抽象到類層次的東東。
6、class Global { public static final String APPNAME= "xyz"; // global constant public static String currentUser = "abc"; // global variable ... } class WhatEver { ... System.out.println(Global.APPNAME); Global.currentUser = "Williams"; }
7、JAVA中不應(yīng)該出現(xiàn)”全局變量“的概念。以上爭論的焦點(diǎn)是:public static final 類型 變量 是否屬于所謂的“全局變量”不得而知。它只不過實(shí)現(xiàn)了全局的意圖。我們要用到該變量時,只需要把該變量所在的類引用進(jìn)來就可以了。這不正是我們所需要的嗎?不過還是要強(qiáng)調(diào)一定要真正理解JAVA當(dāng)初出現(xiàn)的初衷就是為了安全性和跨平臺性。 去掉了類似C,C++中的全局變量的概念,就是基于此的。
8、有了全局變量安全性就差了。
9、不用全局變量固然不無道理,但是世事無絕對,看運(yùn)用,有的時候垃圾也能變成王道! 就象goto一樣,他本身沒什么錯,錯在運(yùn)用者,用的過多過濫當(dāng)然不對,但是為了避免使用GOTO卻用1000行來饒開,難道看1000行代碼就一定看的很清晰嗎?java的全局變亮也是一樣,不能用的太濫,什么東西都往全局上靠圖省事自然會出問題,但是過度恐懼不敢用也不可取,該用的場合還是要用的.特別是獨(dú)體類型,全虛擬機(jī)只有一份,數(shù)據(jù)庫連接池對象一般就是獨(dú)體對象,至于原因,我想不用我多說了吧!
10、如果一個棧內(nèi)存段就能搞定的事情,為何要用多個堆內(nèi)存段來實(shí)現(xiàn)呢?
11、對于“象goto一樣,他本身沒什么錯,錯在運(yùn)用者,用的過多過濫當(dāng)然不對,但是為了避免使用GOTO卻用1000行來饒開,難道看1000行代碼就一定看的很清晰嗎?”確實(shí)全局變量在某些環(huán)境下可能還有其實(shí)際的意義。但是在JAVA中,確實(shí)沒有所謂的全局變量的概念,通過設(shè)置一個abstract class or interface,并將許多final or final static field置于其中,并在使用時調(diào)用ClassName.xxx or InterfaceName.xxx來模擬全局變量的使用(可以肯定的是,在許多的著作中大師們都已經(jīng)反復(fù)強(qiáng)調(diào)了將許多常數(shù)放入一個abstract class or interface,并使之成為常數(shù)類或常數(shù)接口的做法是對此功能的誤用,并不鼓勵如此使用,有興趣可以參閱《effective java》——機(jī)械工業(yè)出版社出版 Joshua Bloch 著),
但首先,final or final static確實(shí)不是全局變量的概念,在JAVA中,一切都是對象,在對象中聲明的無論是field還是method亦或是property都將歸屬于某一種抽象或具體類型,否則也不會在調(diào)用中使用ClassName.xxx or InterfaceName.xxx這樣的形式來加以說明這是這個CLASS的XXX,那是那個INTERFACE的XXX。事實(shí)上final代表的是一種常量形式(Constant),而static則代表一種靜態(tài)觀念,常量的概念是為了區(qū)別于變量而存在的不變的變量(有些別扭,突然發(fā)現(xiàn)自己詞語貧乏,HOHO),而靜態(tài)則是希望區(qū)別于某一具體Object而獨(dú)立存在于某一特定類型的變量(到可以稱之為該類型的全局變量,但個人感覺不很確切)。全局變量的概念顯然過于寬泛,以至于我們說一個程序甚至是一個系統(tǒng)擁有一個唯一的變量變成可能,但final or static顯然不是為其而設(shè)計的(當(dāng)然可以模擬)。其次,閣下提到的有關(guān)于“全虛擬機(jī)只有一份,數(shù)據(jù)庫連接池對象...”是設(shè)計模式中所謂單例模式的實(shí)際應(yīng)用,該模式確實(shí)非常像所謂的全局變量的概念,但設(shè)計這樣單個實(shí)例確實(shí)是因?yàn)樵谙到y(tǒng)的整個生命周期中只需要一份該實(shí)例存在的緣故,更多的是突出概念而非實(shí)際應(yīng)用,而全局變量則更多就是為了實(shí)際應(yīng)用而生,這樣就會導(dǎo)致許多不成熟的,不加思考的應(yīng)用加于其上而導(dǎo)致黏糊的像意大利面條一樣的代碼。所以個人認(rèn)為,依在下實(shí)在低微的學(xué)識實(shí)在不敢胡亂評說關(guān)于全局變量是否有實(shí)際意義這樣巨大的課題,這樣的課題還是留給那些專家去討論吧。至于如何實(shí)際應(yīng)用全局變量,我看,還是有則去之,無則加冕吧,實(shí)在要用偶也么的辦法(不過自從使用C++/JAVA開始,全局變量的使用確實(shí)降到了一個極低的程度,也許是因?yàn)樵谙碌拇a寫的還是太少的緣故吧,呵呵...)。
12、static 變量可以使用,不要認(rèn)為程序中出現(xiàn)了static成員或方法就是程序?qū)懙牟缓?,用不用靜態(tài)成員與程序?qū)懙暮脡臎]有直接的因果關(guān)系,不要鉆牛角尖。
13、interface Global { public static final }