treenode

          在路上。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            5 Posts :: 1 Stories :: 53 Comments :: 0 Trackbacks
          請比較一下這兩段功能大致相同的代碼。拋開語法的差別不論,你覺得哪種風格好?你愿意維護哪一段代碼?

          ????????b.addSelectionListener(?new?SelectionAdapter()
          ????????{
          ????????????
          public?void?widgetSelected(?SelectionEvent?e?)
          ????????????{
          ????????????????Runnable?longJob?
          =?new?Runnable()
          ????????????????{
          ????????????????????
          boolean????done????=?false;
          ????????????????????
          int????????id;

          ????????????????????
          public?void?run()
          ????????????????????{
          ????????????????????????Thread?thread?
          =?new?Thread(?new?Runnable()
          ????????????????????????{
          ????????????????????????????
          public?void?run()
          ????????????????????????????{
          ????????????????????????????????id?
          =?nextId[0]++;
          ????????????????????????????????display.syncExec(?
          new?Runnable()
          ????????????????????????????????{
          ????????????????????????????????????
          public?void?run()
          ????????????????????????????????????{
          ????????????????????????????????????????
          if?(?text.isDisposed()?)
          ????????????????????????????????????????????
          return;
          ????????????????????????????????????????text
          ????????????????????????????????????????????????.append(?
          "\nStart?long?running?task?"
          ????????????????????????????????????????????????????????
          +?id?);
          ????????????????????????????????????}
          ????????????????????????????????}?);
          ????????????????????????????????
          for?(?int?i?=?0;?i?<?100000;?i++?)
          ????????????????????????????????{
          ????????????????????????????????????
          if?(?display.isDisposed()?)
          ????????????????????????????????????????
          return;
          ????????????????????????????????????System.out
          ????????????????????????????????????????????.println(?
          "do?task?that?takes?a?long?time?in?a?separate?thread?"
          ????????????????????????????????????????????????????
          +?id?);
          ????????????????????????????????}
          ????????????????????????????????
          if?(?display.isDisposed()?)
          ????????????????????????????????????
          return;
          ????????????????????????????????display.syncExec(?
          new?Runnable()
          ????????????????????????????????{
          ????????????????????????????????????
          public?void?run()
          ????????????????????????????????????{
          ????????????????????????????????????????
          if?(?text.isDisposed()?)
          ????????????????????????????????????????????
          return;
          ????????????????????????????????????????text
          ????????????????????????????????????????????????.append(?
          "\nCompleted?long?running?task?"
          ????????????????????????????????????????????????????????
          +?id?);
          ????????????????????????????????????}
          ????????????????????????????????}?);
          ????????????????????????????????done?
          =?true;
          ????????????????????????????????display.wake();
          ????????????????????????????}
          ????????????????????????}?);
          ????????????????????????thread.start();
          ????????????????????????
          while?(?!done?&&?!shell.isDisposed()?)
          ????????????????????????{
          ????????????????????????????
          if?(?!display.readAndDispatch()?)
          ????????????????????????????????display.sleep();
          ????????????????????????}
          ????????????????????}
          ????????????????};
          ????????????????BusyIndicator.showWhile(?display,?longJob?);
          ????????????}
          ????????}?);
          另外一種:
          ????????delegate?void?NotifyStartDelegate(?int?threadId?);
          ????????
          delegate?void?NotifyFinishDelegate(?int?threadId?);
          ????????
          ????????btnInvoke.Click?
          +=?BtnInvokeClick;
          ????????
          ????????
          void?BtnInvokeClick(object?sender,?System.EventArgs?e)
          ????????{
          ????????????text.Text?
          =?"invoke?long?running?job";
          ????????????
          ????????????Cursor?
          =?Cursors.WaitCursor;
          ????????????Thread?thread?
          =?new?Thread(?new?ThreadStart(ThreadProc)?);
          ????????????thread.Start();
          ????????}
          ????????
          ????????
          private?void?ThreadProc()
          ????????{
          ????????????
          int?threadId?=?nextId?++;
          ????????????
          bool?done?=?false;
          ????????????
          ????????????
          if?(?IsDisposed?)
          ????????????????
          return;
          ????????????
          ????????????Invoke(?
          new?NotifyStartDelegate(notifyThreadStart),?new?object[]?{?threadId?}?);
          ????????????
          for?(?int?i=0;?i<100000;?i++?)
          ????????????{
          ????????????????
          if?(?IsDisposed?)
          ????????????????????
          return;
          ????????????????Console.WriteLine(?
          "do?task?that?takes?a?long?time?in?a?separate?thread?"?+?threadId?);
          ????????????}
          ????????
          ????????????
          if?(?IsDisposed?)
          ????????????????
          return;
          ????????????Invoke(?
          new?NotifyFinishDelegate(notifyThreadFinish),?new?object[]?{?threadId?}?);
          ????????????done?
          =?true;
          ????????}
          ????????
          ????????
          private?void?notifyThreadStart(?int?threadId?)
          ????????{
          ????????????text.Text?
          +=?"\r\nStart?long?task?"?+?threadId;
          ????????????threadCount?
          ++;
          ????????}
          ????????
          ????????
          private?void?notifyThreadFinish(?int?threadId?)
          ????????{
          ????????????text.Text?
          +=?"\r\nCompleted?long?running?task?"?+?threadId;????
          ????????????threadCount?
          --;
          ????????????
          if?(?threadCount?==?0?)
          ????????????????Cursor?
          =?Cursors.Default;
          ????????}
          ????????
          ????????
          private?int?nextId?=?0;
          ????????
          private?int?threadCount?=?0;

          我在另一個地方也抱怨過:在所有我了解的語言特性里面,沒有一種像Java內部類一樣讓我覺得反感——甚至到了惡心的地步。大多作B/S系統的Java程 序員可能不會有這樣的感覺,因為那個領域基本上很少會用到這個概念??墒窃贑/S,不管用Swing還是SWT,內部類都是繞不過去的一座大山。在閱讀Eclipse站點上許多代碼示例以后,我終于有了痛苦到——一點也不夸張——想要作嘔的地步。上面第一段代碼就是讓我感到窩心的代碼之一(僅僅是其中之一,還不是最丑陋的)。我想,Java 語言的發明者大概從來就沒寫過桌面程序;他根本也不打算為這個領域的程序員提供一種比較好的事件回調機制。

          內部類有什么問題呢?首先,你愿意在去看代碼邏輯之前,先花上好幾分鐘去搞清楚“這個括號到底是和哪個配對”這種蠢問題嗎?你不妨回頭看看第一段的代碼,想想這段其實相當簡單的程序,是不是真的值得用這么多括號去考驗你的智力。

          內部類是對封裝的嚴重破壞。它對外部類的任何私有變量都有完全的訪問權限——如果你突然發現某個變量的內容不對勁了,你不能僅僅在setXXX里面加個斷 點就指望能捕獲到錯誤;真正的元兇可能是內部類里面的哪一句呢。如果內部類都非常簡單,那倒也沒什么??墒钱攦炔款愑脕韺崿F事件的時候,你就沒法指望它一 直那么簡單了。

          內部類是測試的盲區。TDD總是說,要測試,測試,所有包含邏輯的類都應當通過充分的測試??墒莾炔款愒趺礈y試?只要想想就能知道,大多數內部類是根本沒法測試的,它和外部類實在是耦合的太緊密了。匿名內部類的問題更嚴重——它是絕對無法測試的。你怎么測試一個連名字都沒有的方法?

          不管有意無意,內部類在(至少我看到的)實踐中事實上鼓勵了不好的編程風格。就是說,它違背了DRY(Don't Repeat Yourself)的原則。比如,button.addSelectionListener后面幾乎總是跟著SelectionAdapter+括號+ widgetSelected原型再+一堆括號;Display.asyncExec后面總是要寫上new Runnble(),void run(),括號,等等。千篇一律的東西,可是又不得不寫。而且,幾乎沒有什么好的辦法可以改進!因為語法的規則要求你必須這樣做。每天寫這些無聊的東 西,你的話會不會煩?哦,工具是有的。可是工具只負責生成代碼,以后的維護還是要你來做——不是么?
          posted on 2006-06-15 22:37 TreeNode 閱讀(3604) 評論(31)  編輯  收藏 所屬分類: Java技術

          Feedback

          # re: 內部類讓我厭惡Java 2006-06-15 22:44 Anders小明
          嘿嘿,java語言有些地方是不如.net做的好!另外java的語言的演化在有些地方背離了它的初衷。.net平臺一開始規劃的比較好!  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-15 23:07 CowNew開源團隊
          其實你完全可以這樣寫,只把內部類需要實現的方法中抽取出一個新的方法來,比如:
          b.addSelectionListener( new SelectionAdapter()
          {
          public void widgetSelected( SelectionEvent e )
          {
          on_widgetSelected(e);
          }
          } );



          private on_widgetSelected(SelectionEvent e)
          {
          Runnable longJob = new Runnable()
          。。。。。。。
          }
          on_widgetSelected中的方法還可以進一步如此抽取。java確實不適合做界面開發這種層次的工作(雖然sun在努力改進這一點)。如果用好了,java的內部類可比.net的delegate 好用多了,內部類可不光光只是用來做回調這么簡單的工作的。  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-15 23:39 江南白衣
          JFunctor這種用反射實現函數指針的方法可以用么?  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-15 23:46 TreeNode
          答CowNew:我自己就經常這么寫。不過這樣也沒多少好處,比比看C#怎么寫:
          btnInvoke.Click += BtnInvokeClick;

          再看看Java如何用四五行代碼、兩層括號實現同樣的功能。何苦呢?

          我倒是很想看看什么地方可以用內部類優雅的解決其他辦法解決不了或很難解決的問題。但是我還沒有看到過。倒是很多Java教科書都苦口婆心的說:學會適應內部類吧,熟悉以后你會發現它并不是那么難。這樣的說明本身就讓我覺得很有趣。

          回調簡單嗎?我在這個BLOG上的另外一篇里面也說到這個問題?;卣{概念簡單,實現起來其實是相當復雜多變的。這個領域里C++有functor,MFC有Handle Map,ATL有Thunk,VCL有TMethod,Python和Ruby有closure。多到讓人眼花繚亂的地步。Java的實現是最讓我覺得難看的一種。

          答江南白衣:
          JFunctor我不了解,有機會看看。
          自己曾想過用反射,不過反射的問題是Java并不把函數當成對象,因此C#那樣的語法是行不通的。如果用方法名稱的話就沒有編譯器檢查,同步是個問題。
          另反射的性能也要考慮,對于一般的消息沒有問題,如果是MouseMove或者很頻繁的Timer事件是會影響效率的。  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 00:14 CowNew開源團隊
          我對.net的delegate 理解并不是很深入,可能說的有錯誤。我認為delegate只是一個方法指針而已,而java的內部類則是一個類,雖然可能有的時候會和宿主類共享一些成員,但是其封裝性和可復用性更強。  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 00:34 TreeNode
          delegate事實上不是指針而是對象,一個派生于MulticaseDelegate的對象。M$隱藏了它的細節而已。

          內部類的封裝和復用體現在哪呢?我是這么看的:如果它和外部類需要如此緊密的耦合,以至于可以完全訪問外部類的所有私有字段,那么它恐怕根本就不應該作為一個類。不然的話,它反而只是在破壞外部類的封裝。如果它和外部類沒有耦合或者只有接口耦合,那么它完全應當拿出來作為單獨的類。

          我不知道內部類復用性強指的是什么。內部類嚴重依賴于外部類的存在,你根本沒法把它單獨拿出來復用。也許你說的是多個方法可以共用同一個內部類?這不是什么值得一提的優點,其他語言的回調方法一樣是可以共用的。

          我還是希望能看到一個能證明內部類優點的實例,空對空的感覺實在是不太好。
            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 00:58 綠色使者、綠色心情
          @TreeNode
          同意這種說法
          .net很多語法概念,相比java來說,都更便利、高效
          原來一直專注于.net,其中的attribute、delegate,property等等的用法都很喜歡的
          delegate和event配合起來,還可以實現觀察者設計模式,在很多用到事件、消息交換等等的邏輯中,顯得非常直觀
            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 09:52 Robin's Java World
          我想說的是,首先你不應該這么討厭內部類,作為一種語法存在,肯定有一定的道理,而在編程中,我們也確實由于內部類而獲得了一些方便。

          或許你是從.net到java,所以有一些.net先入為主的感覺,你的思維有些習慣.net的做法。我一開始就做java,在做VB和VC編程時反而有些不習慣,思維上有很多方式調整不過來,有些問題自然而然的就想到了用java的思維方式來解決問題。
            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 10:10 原創專欄 開源學習
          不要眼中只有java,c#.
          內部類可以模擬閉包的一些特性。

          那估計你不會接受 python,ruby,javascript這些靈活的語言了。

          .net的delegate只是對MVC的一種封裝,自己實現了個萬能的監聽器,又做了優化。
          代碼寫起來是好了,可理解上就比較差了。 偶是看了 李建忠 翻譯的那本書才弄明白的。其實.net也有很多問題,為了讓開發人員方面,丟掉很多面向對象的概念,對有些人,比如我來說,覺得不倫不類。

          http://www.dearbook.com.cn/book/12797
          這本書不錯  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 13:29 google
          內部類有時候很不錯喲  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 13:40 puke
          既然惡心到這個程度就不要用了,blogjava也清靜點  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 15:29 steeven
          彼此彼此,avalon里面的靜態***Property也很惡心嘛,一堆一堆的.

          畢竟java出來的早,還在恐龍年代,別指望和現代美女比較啦.
          sun也不爭氣,趕快被google收購算球,浪費java  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 18:41 CowNew開源團隊
          內部類不只是用來做回調,回調也不只能用內部類來實現,用內部類實現的回調如果設計合理的話也不一定會ugly。只能說java中因為沒有delegate所以在事件監聽實現上只能用接口實現,而很多人用的時候是直接寫了實現接口的內部類,而沒有進行必要的抽象。內部類沒有錯,只是有人把它用錯了。  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 19:29 TreeNode
          還是沒看到一個實例。呵呵。

          @綠色使者、綠色心情
          基本同意你的看法。Anders做了那么多年Delphi的架構,對于語言的理解的確很少有人能超過他。更重要的是他是一個注重實際的人,了解這方面程序員的實際要求。不過在企業架構這方面他也并不怎么在行,人無完人吧


          @Robin's Java World:
          你猜錯了,我的背景是VC和Delphi。接觸.Net要比Java晚兩三年。
          我自認對語言沒什么偏見,Java的語言特性絕大多數也都樂意接受。只有內部類是例外。

          @原創專欄 開源學習:
          估計錯誤。我很喜歡Ruby,我覺得Ruby用Block來實現回調的辦法很靈巧。

          理解性差何指?如果不研究實現細節,語法上沒什么不好理解的。
          .Net面向對象性問題,我認為ADO.NET和ASP.NET的總體設計是有缺陷的。
          但是對delegate這個語法特性,我覺得沒什么問題。


          @puke:
          內部類我能不用就不用,但是Java我還是要用的。OTL

          @CowNew:
          如果大家都在用看上去有問題的辦法,那就一定存在真正的問題。為什么那些人都要用內部類呢?因為沒有辦法。難道有多少個菜單/按鈕你就寫多少個外部類不成?如果說有人用錯了,那么Java也有責任,因為這種語法就是在逼著人用錯誤的辦法做事。


          另:在google上搜索jfunctor竟然只有幾個看上去像C++的東西,關鍵字錯誤嗎?  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 19:55 江南白衣
          不好意思我完全寫錯單詞了,應該是FunctionalJ(http://functionalJ.sf.net)  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 20:12 寒寒
          哈哈,繼續  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-16 20:22 TreeNode
          看了,FunctionalJ還是弱類型的,引用方法名用的是字符串。
          這種辦法還是需要得到工具的支持才用得起來。
            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-20 11:46 霉干菜
          同意 CowNew說的
          b.addSelectionListener( new SelectionAdapter()
          {
          public void widgetSelected( SelectionEvent e )
          {
          on_widgetSelected(e);
          }
          } );

          多數用倒內部類的時候都是這種swing寫法,就在listener里面新聲明一個
          內部類就是了,不用寫到外面得,多看看就習慣了,哪種語言就算再爛用的
          多了以后看的都會習慣得  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-22 04:17
          匿名類確實惡心,惡心的要命. 什么還沒寫呢,先弄四五行沒用的垃圾在代碼里。

          不過,和什么“可測試”啊,“封裝”啊就別往一塊兒拉扯了。除了語法難看之外,它和其它任何一種closure技術概念上都一樣。想要單獨測試那塊代碼,你不會單獨做個命名外部類先?匿名類本來就是為了封裝一些和局部上下文緊密相關的比較簡單trivial的邏輯的。


          functionalj這種東西我不看好。除了一個簡單的reflection to abstract class的轉換器 (差不多的程序員都可以花半個小時自己寫一個的),難用的curry機制,簡陋的幾個初級函數式算法,啥都沒了。

          要找java的delegate實現,google一下,有比它更好的。
          要在java里搞函數編程,思想可以借鑒,但是這么邯鄲學步不成的。
            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-22 09:54 fantasy
          內部類讓我厭惡 ? .... 匿名類好象才怎么不好玩~

          不過看Java集合類的 Iterator 模式的實現....

          內部類還是很好的。   回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-06-22 18:59 TreeNode
          @豬:
          我不知道你有沒有用過Swing或SWT。為什么我討厭內部類還不得不用它?原因文章和回復里已經說過好幾次了。

          我還特意把程序代碼擺了出來,似乎很多人都不看。哪位有信心說“我能把第一段代碼改到很漂亮”嗎?那樣我就相信你。
            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-07-06 21:50 auguusstt
          樓上太夸張了八,你把java的寫成那樣,再把c#的粉飾一遍,這是不是太哲學腦瓜了!
          隨便揮揮手重構2分鐘都不會讓人有這樣的錯覺!!!
          因為java中沒有把函數作為一等公民,所以確實沒有C#的簡潔,但還不至于像陀屎,在很多情況下也還是很漂漂的。當然加上c#的語法特性會讓有些情況簡單下來

          class MyRunnable3 implements Runnable{
          public void run() {
          if ( text.isDisposed() ) return;
          text.append( "\nCompleted long running task " + id );
          }
          }

          class MyRunnable2 implements Runnable{
          public void run() {
          if ( text.isDisposed() )
          return;
          text.append( "\nStart long running task "+ id );
          }
          }

          class MyRunnable implements Runnable{
          public void run(){
          id = nextId[0]++;
          display.syncExec(new MyRunnable2());
          for ( int i = 0; i < 100000; i++ ){
          if ( display.isDisposed() )
          return;
          System.out.println( "do task that takes a long time in a separate thread " + id );
          }
          if ( display.isDisposed() )
          return;

          display.syncExec(new MyRunnable3());
          done = true;
          display.wake();
          }
          }

          class MySelectionAdapter extends SelectionAdapter implements Runnable {
          public void widgetSelected( SelectionEvent e ){
          BusyIndicator.showWhile( display, this );
          }
          public void run() {
          Thread thread = new Thread( new MyRunnable());
          thread.start();
          while ( !done && !shell.isDisposed() )
          {
          if ( !display.readAndDispatch() )
          display.sleep();
          }
          }
          }

          b.addSelectionListener( new MySelectionAdapter ());
            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-07-07 08:43 TreeNode
          樓上:這段代碼不是我寫的。我不過是把Eclipse.org上面那些大牛的code摘下來一段。

          你看看你重構出來的這幾個類有什么特點?它們都只有一個方法,并且沒有自己的任何狀態。這是一個典型的反模式。一個沒有自己狀態的類根本不應當是一個類。就像Math一樣,不過是為了為那些沒主的方法找一個雜貨柜。內部類在這里就像一個雜貨柜。

          更新text文本本來就應當是窗口的責任。把它作為類的方法是最自然最清晰的,而且可以重用。硬是塞一個內部類干什么?為了滿足方法簽名而已。除此以外對代碼結構沒有一點好處。
            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-07-07 15:28 auguusstt
          這是java沒有函數為第一公民的功能缺少,而不是匿名類或內部類的問題
          有一天您上茅廁,上完后,發現茅廁并沒有準備廁紙,沒辦法,發現每個隔檔都有一個門簾,得救,但由于門簾質地太硬,把屁股擦爛了,于是大罵門簾過于粗糙。  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-07-07 21:36 TreeNode
          Java和內部類都不是我罵的對象。語法只是語法,語法是無辜的。我想罵的是這個設計語言的人。
            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2006-12-01 15:57 心內求法
          @TreeNode
          罵也沒用啊,默默承受吧,默默享受吧,呵呵  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2007-03-31 17:57 喜來樂哈哈
          @TreeNode
          沒有萬能的語言。

          記得一位大牛說過,"設計一門語言最難的一個問題就是對一些優秀的概念說不。" Java沒有加入delegate肯定和當時Java團隊的設計目的有關,別忘了Java最初只是作為小電器的控制語言而設計的,俗話說,三歲看老。都是有歷史原因的。怎樣說Java比C#對編程語言的貢獻要大很多。有人采訪C++的創始人Bjarne Stroup的時候問他對C#的意見,Bjarne Stroup說,他不知道為什么還要開發一門新的像C#這樣的語言。

          匿名類和內部類是在Java1.1才增加的,當時很多Java程序員也反感這東西,主要是不喜歡的它的句法。在此之前的Java程序員往往是這么寫的

          class Clazz implements SelectionAdapter {
          public void widgetSelected(SelectionEvent e){
          // 你的實現
          }

          Clazz() {
          b.addSelectionListener(this);
          }
          }

          這樣寫, 一個不好的地方就是, Clazz也是一個SelectionAdapter.

          應該說當我們習慣內部類以后, 內部類還是給我們帶來了一定的便利. 還是一句老話, 天下沒有免費的午餐. 凡事都是有代價的.

          內部類相比delegate的長處還是有的, 比如, 內部類也可以繼承自另一個類, 從而繼承了另一個類的實現. 這樣的例子比比皆是, 我想, delegate沒法做到吧.

          當然喜歡delegate的人不只你一個, 德國的一個教授搞過一個項目, 好像叫Darwin Lava, 就嘗試為Java加上delegate.

          Java也有可能在將來加入delegate.

          順帶說一句, IBM的大牛們寫的Java代碼, 從細了講談不上漂亮, 那幫人大多原來都是用Smalltalk的, 但是大的結構和框架非常漂亮. 里面有太多軟件設計的大牛了.

          其實從編程語言本身來說Smalltalk要比Java優秀, 而且出現的時間也差不多, Java成功了, 使用Smalltalk的人卻越來越少. 這個世界很有意思的啦.

            回復  更多評論
            

          # re: 內部類讓我厭惡Java 2007-03-31 18:10 喜來樂哈哈
          @auguusstt
          您的廁所和門簾的比喻非常形象. 問題是,

          下次該換個廁所呢, 還是繼續用門簾呢?
          廁所該不該提供廁紙?

          純屬搞笑, 把內部類比喻成門簾有點冤枉.  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2010-10-18 18:13 anonymous
          @TreeNode
          看到你給的這段代碼, 懷疑這位 eclipse 中的大牛的水準, 最少是可讀性代碼 coding 的水準  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2013-09-10 15:35 yicone
          @auguusstt
          要罵肯定也是罵廁所居然不提供廁紙,罵門簾的心理不健全 /tx  回復  更多評論
            

          # re: 內部類讓我厭惡Java 2013-09-10 15:56 yicone
          @喜來樂哈哈
          很客觀了。
          另外,lz客觀地痛陳使用內部類的缺點,對于已經很客觀看待該問題的人可能沒什么幫助,但是多數人不見得有那個見識,所以還是有好處的,比如參與討論的多數人,仍然只是空空地來一句“還是有好處的”。

          “ 這個世界很有意思的啦”,贊。  回復  更多評論
            

          主站蜘蛛池模板: 淮南市| 泽库县| 彰武县| 安阳县| 蒲城县| 威海市| 靖西县| 刚察县| 自贡市| 昆明市| 容城县| 新河县| 丹东市| 兰坪| 拉萨市| 积石山| 汽车| 永川市| 垦利县| 肥乡县| 雅安市| 琼中| 醴陵市| 湾仔区| 炉霍县| 昔阳县| 五莲县| 花莲县| 双辽市| 胶州市| 盈江县| 志丹县| 宜都市| 和硕县| 南和县| 博客| 平陆县| 镇安县| 西和县| 湛江市| 马山县|