A palavra reservada "new" dentro de um parâmetro

Olá a todos!

Sou usuário do Android Studio e, por termos a opção de “desenharmos” o nosso programa através dos arquivos da pasta layout, pouco paramos para entender o código que vai surgindo por trás. Uma dúvida que me surgiu é a simples instância abaixo:

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(**new** View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

Como disse, trata-se de algo simples: estamos instanciando o objeto fab da classe FloatingActionButton e informando que ele ficará aguardando o toque na tela do celular para executar algo.

A minha dúvida é a palavra reservada “new”, que deixei em negrito. O que eu sei sobre ela é que sua função é alocar espaço na memória para poder criarmos um objeto. Então o que ela está fazendo ali sendo que o objeto (fab) já foi criado?

Desde já,

Agradecido!

O new ali não está criando o objeto fab (que é um FloatingActionButton).

O new ali está criando um objeto View.OnClickListener()

Pra ficar mais claro, você pode alterar o código, deixando a criação do objeto fora. Algo como

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

  //criando um objeto  View.OnClickListener()
    View.OnClickListener viewListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        }

fab.setOnClickListener(viewListener );

Obs: esse código não foi testado e pode ser que as classes referentes sejam diferentes. O objetivo é explicar a ideia do new.

Abraço.

2 curtidas

Obrigado pelo retorno e pelo esclarecimento.

Acabou que surgiu-me uma dúvida, rs.

Eu compreendi a lógica de ficar mais fácil se eu criar o objeto fora (e fica mais fácil mesmo). A sintaxe que você usou foi:

View.OnClickListener viewListener = new View.OnClickListener()

A sintaxe de instanciação de objeto que eu conheço leva apenas a classe no linha. Se eu fosse instanciar, eu teria feito da seguinte forma:

View viewListener = new View()

Estaria errado?

Obrigado!

Não é que estaria errado, é que o código View viewListener = new View() cria um objeto View. Mas o método setOnClickListener quer um ClickListener, o que seria incompatível.

Indo um pouco mais a fundo, quando você faz new View.OnClickListener, está criando uma classe anônima que implementa a interface de mesmo nome (veja aqui).

Essa sintaxe com nome da classe + ponto é só uma facilidade criada pelo pessoal do Android, que “embutiu” essa interface dentro da classe View e a deixou acessível através de um método estático. Eles poderiam ter criado um arquivo separado para essa interface, daí o View. (view ponto) não seria necessário, mas possivelmente um import a mais precisaria ser adicionado quando essa interface fosse ser usada.

Ou seja, é só outro jeito de fazer a coisa.

Abraço.