【回転】内部クラス使用シーン1:外部クラスのみで使用される;二:コールバック関数の実現


この内部クラスはその外部クラスに依存して存在し、可能な原因は次のとおりです.
1、他のクラスで使用することはできません.
2、何らかの理由で他のクラスに引用されず、エラーが発生する可能性があります.
3、現在のクラスが大きすぎて、例えばある方法で、中には非常に多くのコードが書かれていて、再構築する必要があります.もしあなたが別のクラスに抽象化したいなら、内部クラスを考えてみてください.なぜなら、これらのコードは現在のクラスから抽象化され、現在のクラスにしか使用されていないので、内部クラスで実現するのもいいからです.以下、おなじみの例で説明します.
この時間に電信のメールの下で送る項目をして、上りのユーザーの携帯電話の番号に対して特殊な処理をしなければならなくて、それからメールを下に出して、それでは主な機能は下のメールで、しかし下で送る前に、ユーザーの番号に対して処理をしなければならなくて、下のメールを満たす時使います.
public class SendSms implements SpInfo
{
          public String sendSms(String userID,String productID,int OPType)
          {
                  String res = null;
                  。。。
                  SendSms.AddressBean ab = new SendSms.AddressBean();//        
                  //             
                  org.apache.axis.types.URI[] addressesuri = ab.getDownAddress(userID);
                  。。。

                  //      soapheader,             。
                  RequestSOAPHeader soapHeader = DownHeader.downHeader_ismp(productID, addressesuri);
                  。。。
                  SMS downsms = new SMS();
                  res = downsms.sendSMS(addressesuri, senderName, charging, down_message,
                  receiptRequest, soapHeader);
              return res;
          }
          
          //   ----             
          public class AddressBean
          {
                  public org.apache.axis.types.URI[] getDownAddress(String senderAddress)
                  {
                          org.apache.axis.types.URI[] addressesuri = null;
                          String proaddress = "tel:" + senderAddress;
                          String[] address = new String[] {proaddress};
                          addressesuri = new org.apache.axis.types.URI[address.length];
                          try
                           {
                                   for (int i = 0; i < address.length; i++)
                                   {
                                            addressesuri[i] = new URI(address[i]);
                                   }
                           }catch(Exception ex)
                           {
                                   ex.printStackTrace();
                           }
                          return addressesuri;
                  }
          }
}

まず、コールバック関数とは何かを理解しなければなりません.
巧みな比喩:コールバック関数は本当にあなたが持っているBP機に似ています:他の人に番号を教えて、それが用事がある時Callあなた
コールバックは層間連携に用いられ、上層は下層に本層関数を実装する.この関数はコールバックであり、下層は一定の条件下でコールバックをトリガする.例えば、駆動として下層であり、彼はデータを受信すると、本層の処理作業を完了するほか、コールバックを行い、このデータを上層アプリケーション層に渡してさらなる処理を行う.これは階層化されたデータ通信において一般的である.
実際にはコールバックとAPIは非常に近く、彼らの共通性は階層間呼び出しの関数である.しかし、違いはAPIが低層から高層に提供される呼び出しであり、一般的にこの関数は高層に対して既知である.コールバックは正反対に、彼は上層部が下層部に提供する呼び出しであり、低層については未知であり、上層部がインストールしなければならない.このインストール関数は実は低層が提供するAPIであり、インストール後の低層はこのコールバックの名前を知らないが、関数の指針でこのコールバックを保存し、呼び出す必要がある場合、この関数ポインタと関連するパラメータポインタを参照するだけです.
実は:コールバックはこの関数が上層部に書かれていて、低層は1つの関数ポインタでこの関数を保存して、あるイベントのトリガの下で、低層はこの関数ポインタで上層部の関数を呼び出します.
コールバックに関するまとめ:
Javaでは、通常、別のクラスやクラスライブラリを作成する人がインタフェースを規定し、このインタフェースを実現し、このインタフェースのオブジェクトをパラメータとして他の人のプログラムに渡し、他の人のプログラムが必要に応じてそのインタフェースを通じて作成した関数を呼び出します.
Javaコールバック関数を使用して、関数の実行時間をテストするツールクラスを実装します.
クラスのメソッドの実行時間をテストする場合は、通常、次のようにします.
JAvaコード
public class TestObject {  
    /** 
     *           ,             
     */  
    public static void testMethod(){  
        for(int i=0; i<100000000; i++){  
              
        }  
    }  
    /** 
     *                  
     */  
    public void testTime(){  
        long begin = System.currentTimeMillis();//        
        testMethod();//      
        long end = System.currentTimeMillis();//        
        System.out.println("[use time]:" + (end - begin));//        
    }  
      
    public static void main(String[] args) {  
        TestObject test=new TestObject();  
        test.testTime();  
    }  
}  

testTime()メソッドを見ると、「//テストメソッド」だけが変更する必要があります.次に、同じ機能を実現する関数を作成しますが、より柔軟にします.
まずコールバックインタフェースを設定します.
JAvaコード
public class Tools {  
      
    /** 
     *         ,    CallBack   execute   
     * @param callBack 
     */  
    public void testTime(CallBack callBack) {  
        long begin = System.currentTimeMillis();//        
        callBack.execute();///        
        long end = System.currentTimeMillis();//        
        System.out.println("[use time]:" + (end - begin));//        
    }  
      
    public static void main(String[] args) {  
        Tools tool = new Tools();  
        tool.testTime(new CallBack(){  
            //  execute    
            public void execute(){  
                //                       
                TestObject.testMethod();
            }  
        });  
    }  
      
}

上の文字とコードでjavaというコールバックが理解できます.では、私たちは具体的にいつコールバック関数を使用しますか?
JDBCプログラミングを行う場合、try catch文ブロックによく書きますが、コールバック技術を採用すれば、重複する書き込みを完全に避けることができ、自分のメソッド体をコールバックインタフェースの方法で実現し、毎回同じtry catchに伝えられますが、それぞれのメソッドの内容は異なります.
また、例えばアルゴリズムが多い場合でも、このような実装モードを用いて実現することができる.最近SFTを見ると、多くのイベント駆動がコールバックで実現されていることがわかりました.たとえば、ボタンにイベントを追加します.
                            Button okButton = createButton(buttons, "&Ok", "Process input",
                                       new MySelectionAdapter(){
                                           public void widgetSelected(SelectionEvent e)
                                           {
                                               System.out.println("Name:         " + nameField.getText());
                                               System.out.println("Address:      " + addrField.getText());
                                               System.out.println("Phone number: " + phoneField.getText());
                                           }
                                       });

匿名の内部類が最もよく使われるのは、コールバックのすばらしい表現だ.コールバックは双方向呼び出しモードであり、すなわち、呼び出された側もインタフェースが呼び出されたときに相手のインタフェースを呼び出す.