最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 中引入內(nèi)部類的意義?

 更新時間:2019年06月19日 15:18:55   作者:胖君  
這篇文章主要介紹了Java 中引入內(nèi)部類的意義?文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下

前言

這是個好問題,因為它讓我想起來自己剛學到內(nèi)部類時候的“想用的沖動”。

導致我代碼里到處都是層層的內(nèi)部類套嵌。不但經(jīng)常搞得靜態(tài)域錯誤一堆(內(nèi)部類不允許有static成員字段),而且過一段時間自己都搞不清當初寫的是什么。

一個很重要的設(shè)計準則是:設(shè)計是做減法,能不用模式就不用模式。

這個準則對內(nèi)部類來說同樣適用。

所以回答這個問題的基調(diào)應該是:

能不用內(nèi)部類就不用內(nèi)部類。

實踐

我以前覺得內(nèi)部類用來有針對性地暴露外部類的特定接口,比一下子把整個對象都給人家要好。比如說下面代碼中的外部類Outer實現(xiàn)了三個接口方法,能跑,能飛,能思考。然后有三個方法getRunner(),getFlyer(),getThinker()有針對性地對外暴露部分功能接口。

 public interface Runnable{ public void run(); } public interface Flyable{ public void fly(); } public interface Thinkable{ public void think(); } public class Outer{
 public void run(){ //do something } 
 public void fly(){ //do something }
 public void think(){ //do something } 
public class Runner implements Runnable{ 
public void run(){Outer.this.run();} } 
public class Flyer implements Flyable{ 
public void fly(){Outer.this.fly();} } 
public class Thinker implements Thinkable{ 
public void think(){Outer.this.think();} } 
public Runner getRunner(){return new Runner();} public Flyer getFlyer(){return new Flyer();} 
public Thinker getThinker(){return new Thinker();} } 

但實際上直接實現(xiàn)三個接口不是就很好嘛。用內(nèi)部類根本算不上優(yōu)雅,多了很多代碼。僅僅為了暴露接口根本不需要使用內(nèi)部類。

public interface Runnable{ public void run(); } public interface Flyable{ public void fly(); } public interface Thinkable{ public void think(); } public class Outer implements,Runnable,Flyable,Thinkable{ 
public void run(){ //do something } 
public void fly(){ //do something } 
public void think(){ //do something } } 

再或者說常見的控制框架。我們定義個Event接口,必須有action()方法。在外部類里定義事件處理的流程。然后定義了幾個實現(xiàn)Event接口的內(nèi)部類。

public interface Event{ public void action(); } public class Controller{ 
private int id; 
private List<Event> list=new ArrayList<Event>(); 
public void prepare(){ //put new events into the list } 
public void doEvents(){ //do every events in the list } 
public class A implements Event{ 
public void action(){ //do something } } 
public class B implements Event{ 
public void action(){ //do something } } } 

但這也不是非內(nèi)部類不可。獨立定義A,B類,最后再把Event對象組合到Controller里完全可以,而且更簡潔易讀。

另外,說到內(nèi)部類,經(jīng)常會提到閉包,回調(diào)。但內(nèi)部類也不是唯一的方案。簡單的繼承,組合都能實現(xiàn)同等的數(shù)據(jù)封裝效果。

但Java到底需不需要內(nèi)部類?答案還是需要的。Java引入內(nèi)部類的真正意義就在于,還是有很多情況,沒有內(nèi)部類是處理不了的,或者用內(nèi)部類處理起來更加優(yōu)雅。

還是第一個例子。如果外部類不止有一種接口實現(xiàn)方法。如果我實現(xiàn)了Runnable接口,就只能定義一個run()方法。這時候內(nèi)部類就派用場了。比如,企鵝既會跑,又會游泳。所以它的兩個內(nèi)部類實現(xiàn)兩種不同的run()??梢苑祷貎煞N不同的Runnable引用。

public interface Runnable{ public void run(); } public class Penguin{ 
public void run(){ //do something } 
public void swim(){ //do something } 
public class Running implements Runnable{
 public void run(){Penguin.this.run();} } 
public class Swimming implements Runnable{ 
public void run(){Penguin.this.swim();} } 
public Runner getRunner(){return new Running();} public Flyer getSwimmer(){return new Swimming();} } 

另一種典型場景就是多繼承。如果外部類已經(jīng)繼承了某個基類,比如說企鵝繼承自鳥類。但Runnable這時候正好是一個abstract抽象類呢?Java不支持多繼承,內(nèi)部類可以解決這個問題。

public class Bird{ //some code here } 
public abstract class Runnable{ 
public abstract void run(); } 
public class Penguin extends Bird{ 
public class Runner extends Runnable{ //do something } 
public Runner penguinCanRun(){return new Runner();} } 

剛才提到了控制框架可以不用內(nèi)部類。但實際上你看看事件驅(qū)動的Swing里到處都是內(nèi)部類。為什么呢?因為有大量的事件,而且多數(shù)事件的相應方法只被用到了一次。用內(nèi)部類是為了控制類的數(shù)量,考慮的是更好地封裝。

內(nèi)部類另外一個好的特性就是它獨立于外部類,不會像組合一樣隨著外部類的初始化而一起被初始化。而是在我們需要它的時候再創(chuàng)建它。比如說容器里的迭代器,需要我們手動創(chuàng)建。作為可選組件存在于外部類中,不會增加外部類的負擔。

總之,要知道什么時候真正需要內(nèi)部類,先要搞清楚什么時候可以不用內(nèi)部類。內(nèi)部類不是大力丸,不要濫用內(nèi)部類

相關(guān)文章

  • 如何在IDEA中查看依賴關(guān)系的方法步驟

    如何在IDEA中查看依賴關(guān)系的方法步驟

    這篇文章主要介紹了如何在IDEA中查看依賴關(guān)系的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Spring事件監(jiān)聽基本原理與使用詳解

    Spring事件監(jiān)聽基本原理與使用詳解

    這篇文章主要介紹了Spring事件監(jiān)聽基本原理與使用詳解,Spring的事件監(jiān)聽機制和發(fā)布訂閱機制是很相似的:發(fā)布了一個事件后,監(jiān)聽該類型事件的所有監(jiān)聽器會觸發(fā)相應的處理邏輯,需要的朋友可以參考下
    2024-01-01
  • 淺談spring中isolation和propagation的用法

    淺談spring中isolation和propagation的用法

    這篇文章主要介紹了淺談spring中isolation 和propagation的用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • SpringBoot中日志切面實現(xiàn)小結(jié)

    SpringBoot中日志切面實現(xiàn)小結(jié)

    本文介紹了SpringBoot中日志切面實現(xiàn)小結(jié),通過定義一個自定義注解和創(chuàng)建一個日志切面類,為方法添加日志記錄功能,感興趣的可以了解一下
    2024-11-11
  • 在Spring boot的項目中使用Junit進行單體測試

    在Spring boot的項目中使用Junit進行單體測試

    今天小編就為大家分享一篇關(guān)于spring boot使用Junit進行測試,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • java 線程之對象的同步和異步(實例講解)

    java 線程之對象的同步和異步(實例講解)

    下面小編就為大家?guī)硪黄猨ava 線程之對象的同步和異步(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java應用打包成Docker鏡像

    Java應用打包成Docker鏡像

    這篇文章主要為大家介紹了Java應用打包成Docker鏡像的過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • IDEA?報Plugin'maven-resources-plugin:'not?found?的解決方案

    IDEA?報Plugin'maven-resources-plugin:'not?found?

    如果在使用?IDEA?時遇到?"Plugin?'maven-resources-plugin:'?not?found"?錯誤,可能是由于?Maven?倉庫中未找到所需的?Maven?插件,近小編給大家分享幾種解決方法,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • SpringMVC框架實現(xiàn)圖片上傳與下載

    SpringMVC框架實現(xiàn)圖片上傳與下載

    這篇文章主要為大家詳細介紹了SpringMVC框架實現(xiàn)圖片上傳與下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • SpringBoot中的靜態(tài)資源訪問的實現(xiàn)

    SpringBoot中的靜態(tài)資源訪問的實現(xiàn)

    這篇文章主要介紹了SpringBoot中的靜態(tài)資源訪問的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09

最新評論

襄城县| 湖北省| 买车| 炉霍县| 明水县| 苏尼特左旗| 海门市| 凌海市| 苍南县| 龙州县| 虎林市| 景泰县| 洪江市| 读书| 洮南市| 吉隆县| 元氏县| 同江市| 三明市| 定南县| 留坝县| 宁海县| 涞水县| 图们市| 芮城县| 睢宁县| 昌图县| 屏山县| 镇康县| 周至县| 湛江市| 湖口县| 焦作市| 车致| 监利县| 九台市| 盐津县| 张家港市| 县级市| 宜阳县| 孟连|