Normalmente você deve declarar uma classe antes de instanciá-la. Classes anônimas são declaradas e instanciadas ao mesmo tempo.
O código que mostrou é equivalente a isso:
class MyFunction implements Function<String, String> {
private static final long serialVersionUID = 1L;
@Override
public String call(String row) throws Exception {
return row.replaceAll("\r\n", " ");
}
}
JavaRDD dataSchemaRdd = dataSchema.map(new MyFunction());
Se MyFunction
só será usada uma vez em todo meu programa, não faz sentido eu declará-la. Muito melhor usar a versão anônima.
Este é o ponto, ela não tem nome, é anônima!
Tecnicamente, uma classe anônima sempre está implementando uma interface ou extendendo uma classe.
Ou seja, classes anônimas devem ter como base uma interface ou classe previamente declarada.
Você pode criar classes anônimas a partir de qualquer interface ou apartir de qualquer classe que não seja declarada final
.
public class Program {
static class C {}
interface I {}
static final class FC {}
public static void main(String[] args) {
C c = new C() {}; // criando apartir de uma classe
I i = new I() {}; // criando apartir de uma interface
FC fc = new FC() {}; // isso dá erro, FC é final
}
}
Acredito que o principal motivo seja praticidade. É como eu disse lá em cima, se uma certa função será usada apenas uma vez no programa todo, pra quê perder tempo a declarando? Melhor usar uma anônima.
Para saber mais:
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
https://docs.oracle.com/javase/specs/jls/se10/html/jls-15.html#jls-15.9.5