Java - Clase Anónima
Concepto
-
Clase
sin nombre que define y utiliza en un solo lugar en el código -
Permite
declarar
einstanciar
unaclase
al mismo tiempo invocando unainterface
oclase extensible
como unaclase abstracta
-
Son como
clases locales
excepto queno tienen nombre
Se utiliza para crear y usar una
clase local
una sola vez
Ventajas
-
Son
clases
se usan sobre todo comoescuchadores-Listeners
,Callbacks
oEventos
-
Pueden acceder a
variables locales
que se encuentren a su entorno
Declaración
-
Las
clases locales
son declaraciones de clase- las
clases anónimas
sonexpresiones
→ define laclase
enotra expresión
- las
Sintaxis
Recuerda :
Clase anónima
→expresión
-
Sintaxis
de unaexpresión
declase anónima
- Es como la invocación de un
constructor
excepto que hay unadefinición
declase contenida
en unbloque de código
- Es como la invocación de un
-
Considere la
instanciación
del objetofrenchGreeting
// Clase Anónima
// ↓
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
// Método heredados de la interface HelloWorld e implementados in situs
public void greet() {
greetSomeone("tout le monde");
}
// Método heredados de la interface HelloWorld e implementados in situs
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
-
La
expresión
declase anónima
consta-
El
nuevo operador
-
El nombre de una
interfaz
para implementar o unaclase
paraextender
-
-
Ejemplo
- La
clase anónima
implementa lainterfaz HelloWorld
- La
-
Paréntesis
que contienen losargumentos
de unconstructor
, como unaexpresión
decreación
deinstancia
declase concreta
Cuando implementa una interfaz no hay un constructor por lo que usa un par de paréntesis vacíos, como en este ejemplo
-
El
cuerpo
que es una dedeclaración de clase
- Se permiten las
declaraciones de métodos
perono
lasdeclaraciones
- Se permiten las
-
Definición
declase anónima
es unaexpresión
que debe ser parte de unadeclaración
-
Ejemplo
-
La expresión de
clase anónima
es parte de lainstrucción
queinstancia
elobjeto frenchGreeting
Esto explica por qué hay un punto y coma después de la llave de cierre
-
-
Acceso Variables Locales (Ámbito de la Aplicación)
-
Puede capturar
variables locales
- Tienen el
mismo ámbito
de acceso a lasvariables locales
- Tienen el
-
Clase anónima
-
Tiene
acceso
a losmiembros
de suclase envolvente
-
No puede acceder a las
variables locales
en su ámbito adjunto que no estén declaradas como finales -
Igual que las
clases anidadas
ladeclaración
de untipo
( como una variable ) en unaclase anónima
oculta cualquier otra declaración en elámbito
de la aplicación que tenga el mismo nombre
-
Permite
-
Campos →
Fields
-
Métodos adicionales
( incluso si no implementan ningúnmétodo
de laSuperClase
) -
Inicializadores de instancia →
Constructores
-
Clases locales
Restricciones
-
No puede declarar
elementos estáticos
-
No puede declarar nuevos
atributos miembros
de lasinterfaces
-
Permite
atributos miembros estáticos
siempre que sean deltipo constantes
Ejemplos
1. Ejemplo
-
Tenemos interfaz llamada
Operacion
que tiene unmétodo
llamadorealizarOperacion
tomados enteros
ydevuelve
su suma -
Podemos
implementar
estainterfaz
// Clase Anónima
// ↓
Operacion suma = new Operacion() { // Expresión completa de la Clase Anónima
// Método heredado e implementado
public int realizarOperacion(int a, int b) {
return a + b;
}
}; // Fin de la implementación de la Clase Anónima
-
Explicación
-
Estamos creando una
clase anónima
que implementa la interfaz “Operacion” y redefine elmétodo realizarOperacion()
para que devuelva la suma de dos números -
La
clase anónima
se crea en elmismo lugar donde se utiliza
yno tiene un nombre propio
-
Ejemplo en el que se puede usar una
clase anónima
es cuandose necesita
heredar de unaclase existente
yredefinir
algunos de sus métodos
-
2. Ejemplo
-
Tenemos una clase llamada
Persona
que tiene un métodosaludar()
que imprime un saludo por pantalla -
Podemos
crear
unaclase anónima
queherede
dePersona
y redefina el métodosaludar()
de la siguiente forma
// Clase Anónima
// ↓
Persona saludadorEspecial = new Persona() {
public void saludar() {
System.out.println("Hola, ¿cómo estás?");
}
};
-
Explicación
-
Estamos creando una
clase anónima
que hereda dePersona
y redefine sumétodo saludar()
para queimprima
un saludodiferente
aloriginal
- La
clase anónima
secrea
y seutiliza
en elmismo lugar
y no tiene un nombre propio
- La
-
3. Ejemplo
- La clase
HelloWorldAnonymousClasses
usaclases anónimas
en las declaraciones de inicialización devariables locales
frenchGreeting
yspanishGreeting
pero usa unaclase local
para la inicialización de lavariable englishGreeting
// Clase Concreta
public class HelloWorldAnonymousClasses {
// Declaración de una interface dentro de la Clase Concreta
interface HelloWorld {
// Declaración de procedimientos
public void greet();
public void greetSomeone(String someone);
}
// Procedimiento de la clase HelloWorldAnonymousClasses
public void sayHello() {
// Clase Interna Local que hereda de la Interface HelloWorld para implementar sus método
//
// Clase Anónima
// ↓
class EnglishGreeting implements HelloWorld {
// Atributo Local
String name = "world";
// Procedimiento de la Clase HelloWorldAnonymousClasses
public void greet() {
greetSomeone("world");
}
// Procedimiento de la Clase HelloWorldAnonymousClasses
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hello " + name);
}
}
// Instanciación de la clase HelloWorld
HelloWorld englishGreeting = new EnglishGreeting();
// Instanciación de la "Clase Anónima HelloWorld"
// ↓
HelloWorld frenchGreeting = new HelloWorld() {
// Atributo local
String name = "tout le monde";
// Procedimiento de la Clase HelloWorldAnonymousClasses
public void greet() {
greetSomeone("tout le monde");
}
// Procedimiento de la Clase HelloWorldAnonymousClasses
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
// Declaración de la "Interface" convertida en "Clase Anónima"
HelloWorld spanishGreeting = new HelloWorld() {
// Atributo local
String name = "mundo";
// Procedimiento implementando desde la Interface - Clase Anónima
public void greet() {
greetSomeone("mundo");
}
// Procedimiento implementando desde la Interface - Clase Anónima
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hola, " + name);
}
};
// Instanciaciones
englishGreeting.greet();
frenchGreeting.greetSomeone("Fred");
spanishGreeting.greet();
}
public static void main(String... args) {
HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}
4. Ejemplo
-
Clase anónima
usado en unainterface gráfica de usuario (GUI)
- Crea
frame/marco
que contiene un botón que diga'Hello World'
- Crea
-
Invocación del método
btn.setOnAction()
especifica lo que sucede cuando se pulsa el botónHello World
-
Método
requiere un objeto de tipoEventHandler<ActionEvent>
-
La
interfaz EventHandler<ActionEvent>
contiene solo un método llamadohandle
-
En lugar de implementar este método con una
nueva clase
- Ejemplo usa una
expresión
declase anónima
- Ejemplo usa una
-
Observe que esta
expresión
es elargumento
pasado al métodobtn.setOnAction
-
Debido a que la
interfaz EventHandler<ActionEvent>
contiene solo un método puede usar unaexpresión lambda
en lugar de unaexpresión de clase anónima
-
Las
clases anónimas
son ideales para implementar unainterfaz
que contiene dos o másmétodos
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
// AQUÍ SE DECLARA : Clase Anónima
// ↓
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
5. Ejemplo
-
Personalización de controles de interfaz de usuario
-
El crea un campo de texto que solo acepta valores numéricos
-
Redefine la
implementación
predeterminada de laclase TextField
con unaClase Anónima
reemplazando losmétodos replaceText()
yreplaceSelection()
heredados de laclase TextInputControl
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class CustomTextFieldSample extends Application {
final static Label label = new Label();
@Override
public void start(Stage stage) {
Group root = new Group();
Scene scene = new Scene(root, 300, 150);
stage.setScene(scene);
stage.setTitle("Text Field Sample");
GridPane grid = new GridPane();
grid.setPadding(new Insets(10, 10, 10, 10));
grid.setVgap(5);
grid.setHgap(5);
scene.setRoot(grid);
final Label dollar = new Label("$");
GridPane.setConstraints(dollar, 0, 0);
grid.getChildren().add(dollar);
final TextField sum = new TextField() {
@Override
public void replaceText(int start, int end, String text) {
if (!text.matches("[a-z, A-Z]")) {
super.replaceText(start, end, text);
}
label.setText("Enter a numeric value");
}
@Override
public void replaceSelection(String text) {
if (!text.matches("[a-z, A-Z]")) {
super.replaceSelection(text);
}
}
};
sum.setPromptText("Enter the total");
sum.setPrefColumnCount(10);
GridPane.setConstraints(sum, 1, 0);
grid.getChildren().add(sum);
Button submit = new Button("Submit");
GridPane.setConstraints(submit, 2, 0);
grid.getChildren().add(submit);
// Clase Anónima
// ↓
submit.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
label.setText(null);
}
});
GridPane.setConstraints(label, 0, 1);
GridPane.setColumnSpan(label, 3);
grid.getChildren().add(label);
scene.setRoot(grid);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Deja un comentario