Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的匿名内部类及其语法_Java_Android - Fatal编程技术网

java中的匿名内部类及其语法

java中的匿名内部类及其语法,java,android,Java,Android,我对Java非常陌生,我正在尝试编写一个android应用程序,并通过facebook api进行测试。我特别关注的是这个 LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult log

我对Java非常陌生,我正在尝试编写一个android应用程序,并通过facebook api进行测试。我特别关注的是这个

    LoginManager.getInstance().registerCallback(callbackManager,
        new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code
            }

            @Override
            public void onCancel() {
                 // App code
            }

            @Override
            public void onError(FacebookException exception) {
                 // App code   
            }
});
但是,这从未调用FaceBookCallbackLogin中的onSuccess方法,而且我无法显式调用它,因为我没有参数LoginResult

那么,我该如何编写它,以便在不同的类中登录?在原始代码中,onSuccess-LoginResult的参数来自哪里

好吧,那就这么说吧

匿名类使您的代码更加简洁。 它们使您能够同时声明和实例化一个类。 它们与本地类类似,只是它们没有名称。使用 如果只需要使用一次本地类,则可以使用它们

上述方法的一个好处是,它允许您精确地定义特定接口实现,而无需为每个实现创建新类。看看下面的例子

interface Foo {
    String saySomething(String something);
}

class Bar {

  public static void main(String [] args) {
      //I want this anonymous inner classes implementation to **uppercase** the strings
      Foo sayUppercase = new Foo() {
          @Override
          public String saySomething(String something) {
              return something.toUpperCase();
          }
      };
      sayUppercase.saySomething("Java");
      //output: JAVA

      Foo sayLowerCase = new Foo() {
          //I want this anonymous inner classes implementation to **lowercase** the strings
          @Override
          public String saySomething(String something) {
              return something.toLowerCase();
          }
       };
       sayLowerCase.saySomething("Java");
      //output: java
  }  
}
请注意,我是如何以不同的方式实现相同的saySomething方法的,而不必为每个实现创建两个单独的类文件。我几乎内联了这个类的实现

从Android的角度来看,这非常有用,想象一下必须为您的点击监听器创建一个单独的类。仍然有可能,但是为click listener的实现创建一个简单的匿名内部类要简单得多,可读性也更高

mLoginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //Perform Action
        }
    });
比创建一个实现View.OnClickListener的新类要简单得多,如下所示

public class LoginButtonOnClickListener implements View.OnClickListener {

    @Override
    public void onClick(View view) {
        //Perform action
    }
}

从匿名内部类更改为独立类的方式看起来很好

但是,在第一个示例中,您已经完成了以下操作:

LoginManager.getInstance().registerCallback
loginButton.registerCallback
在第二个示例中,您已经这样做了:

LoginManager.getInstance().registerCallback
loginButton.registerCallback
也许这就是问题所在