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

时间:2018-01-16 03:17:42

标签: java android

我对Java非常陌生,我试图编写一个Android应用程序并通过facebook api。我正在查看this page,具体来说,这是

    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   
            }
});

这项工作很好,我只是想了解如何。我不理解方法中的方法,更具体地说,如果我想以不同的方式编写它,我将如何提取它?

我尝试创建另一个类

public class FaceBookCallbackLogin implements FacebookCallback<LoginResult> {



@Override
public void onSuccess(LoginResult loginResult) {
    ....
}

@Override
public void onCancel() {

}

并尝试从我的MainActivity启动登录

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    callbackManager = CallbackManager.Factory.create();
    setContentView(R.layout.activity_main);
    info = (TextView)findViewById(R.id.info);
    loginButton = (LoginButton)findViewById(R.id.login_button);
    loginButton.setReadPermissions("email");

    loginButton.registerCallback(callbackManager, new FaceBookCallbackLogin());
}

但是,这从未在FaceBookCallbackLogin中调用onSuccess方法,我无法明确地调用它,因为我没有param LoginResult。

那么,我怎么写这个,所以我可以登录不同的类?在原始代码中,onSuccess的参数 - LoginResult - 来自哪里?

2 个答案:

答案 0 :(得分:1)

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

然而,在第一个例子中,你已经这样做了:

LoginManager.getInstance().registerCallback

在第二个例子中你做到了:

loginButton.registerCallback

也许这就是问题..

答案 1 :(得分:0)

好的,所以Javadocs

  

“匿名类使您可以使代码更简洁。   它们使您能够同时声明和实例化一个类。   他们就像当地的班级,除了他们没有名字。使用   如果你只需要使用本地类一次“。

上述优点是它允许您准确了解特定接口实现的定义,而无需为每个实现创建新类的麻烦。请看下面的例子。

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角度来看,这非常有用,想象一下必须为点击侦听器创建一个单独的类。它仍然是可能的,但是为您的点击监听器的实现创建一个简单的匿名内部类更加简单和可读

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
    }
}