Sei sulla pagina 1di 5

Listado 14.

3: Una miembro clase interna


package app14;
class TopLevel {
private int value = 9;
class Inner {
int calculate() {
return value;
}
}
}
public class MemberInnerTest1 {
public static void main(String[] args) {
TopLevel topLevel = new TopLevel ();
TopLevel.Inner inner = topLevel.new Inner();
System.out.println(inner.calculate());
}
}

Fjese en cmo se crea una instancia de la clase interna en el listado 14.3


Una clase interna miembro puede utilizarse para ocultar una implementacin
completamente, algo que no pueden hacer sin emplear una clase interna. El
siguiente ejemplo muestra cmo se puede utilizar una clase de miembro para
ocultar una implementacin completamente.

Listado 14.4: ocultar completamente las implementaciones

package app14;
interface Printer {
void print(String message);
}
class PrinterImpl implements Printer {
public void print(String message) {
System.out.println(message);
}
}
class SecretPrinterImpl {
private class Inner implements Printer {
public void print(String message) {
System.out.println("Inner:" + message);
}
}
public Printer getPrinter() {
return new Inner();
}
}
public class MemberInnerTest2 {
public static void main(String[] args) {
Printer printer = new PrinterImpl();
printer.print("oh");
// abatido a PrinterImpl
PrinterImpl impl = (PrinterImpl) printer;
Printer hiddenPrinter =
(new SecretPrinterImpl()).getPrinter();
hiddenPrinter.print("oh");
// No abatido hiddenPrinter to Outer.Inner
// porque es privado interior
}
}
La interfaz de la impresora en la lista 14.4 tiene dos implementaciones. La primera
es la clase PrinterImpl, que es una clase normal. Implementa el mtodo print como
un mtodo pblico. La segunda aplicacin puede encontrarse en
SecretPrinterImpl. Sin embargo, en lugar de implementar la interfaz de la
impresora, el SecretPrinterImpl define una clase privada denominada Inner, que
implementa la impresora. El mtodo de SecretPrinterImpl getPrinter devuelve una
instancia de interior.

Cul es la diferencia entre PrinterImpl y SecretPrinterImpl? Usted puede ver esto


en el mtodo main en la clase test:

printer printer = new PrinterImpl();


printer.print("Hiding implementation");
// abatido a PrinterImpl
PrinterImpl impl = (PrinterImpl) printer;
Printer hiddenPrinter = (new SecretPrinterImpl()).getPrinter();
hiddenPrinter.print("Hiding implementation");
// no abatido hiddenPrinter a Outer.Inner
// Porque es privado interior

Se asigna una instancia de impresora PrinterImpl, y puede volver a impresora


PrinterImpl. En la segunda instancia, puede asignar a la impresora con una
instancia de interior llamando al mtodo getPrinter en SecretPrinterImpl. Sin
embargo, no hay manera de que puedas volver a SecretPrinterImpl.Inner porque
es privado y por lo tanto no es visible.
Las clases internas locales

una clase interna local, o local de clase, es una clase interna que, por definicin,
no es una clase de miembro de cualquier otra clase (porque su declaracin no es
directamente dentro de la declaracin de la clase externa). Las clases tienen un
nombre, en contraposicin a las clases annimas que no lo hacen. Un local de
clase puede declararse dentro de cualquier bloque de cdigo, y su alcance est
dentro del bloque. Por ejemplo, puede declarar una clase local dentro de un
mtodo, un if bloque, a while bloque, y as sucesivamente. Desea escribir una
clase local si hay una instancia de la clase se utiliza slo dentro del mbito. Por
ejemplo, la enumeracin de 14.5 muestra un ejemplo de una clase local.

14.5: Listado de clase interna local.

package app14;
import java.util.Date;
interface Logger {
public void log(String message);
}
public class LocalClassTest1 {
String appStartTime = (new Date()).toString();
public Logger getLogger() {
class LoggerImpl implements Logger {
public void log(String message) {
System.out.println(appStartTime + " : " + message);
}
}
return new LoggerImpl();
}
public static void main(String[] args) {
LocalClassTest1 test = new LocalClassTest1();
Logger logger = test.getLogger();
logger.log("Local class example");
}
}
La clase en la lista 14.5 tiene una clase local denominada LoggerImpl ue reside
dentro de un mtodo GetLogger. El mtodo GetLogger debe devolver una
implementacin de la interfaz del registrador y esta aplicacin no ser utilizado en
otro lugar. Por lo tanto, es una buena idea hacer una aplicacin que es local
getLogger. Tenga en cuenta tambin que el mtodo de registro dentro de la clase
tiene acceso local al campo de instancia appStartTime de la clase externa. Sin
embargo, hay ms. No slo un local de clase tienen acceso a los miembros de la
parte externa de su clase, tambin tiene acceso a las variables locales. Sin
embargo, slo puede acceder a variables locales finales. El compilador generar
un error de compilacin si intenta acceder a una variable local que no es final.

Listado 14.6 modifica el cdigo en el listado 14.5 . El mtodo GetLogger en el


listado 14.6 permite pasar una cadena (String) que se convierte en el prefijo de
cada lnea registrados.

14.6: Prueba PrefixLogger listado.

package app14;
import java.util.Date;
interface PrefixLogger {
public void log(String message);
}
public class LocalClassTest2 {
public PrefixLogger getLogger(final String prefix) {
class LoggerImpl implements PrefixLogger {
public void log(String message) {
System.out.println(
prefix
+ " : " + message);
}
}
return new LoggerImpl();
}
public static void main(String[] args) {
LocalClassTest2 test = new LocalClassTest2();
PrefixLogger logger = test.getLogger("DEBUG");
logger.log("Local class example");
}
}

Clases internas annimas

Una clase interna annima no tiene nombre. El uso de este tipo de clase anidada
es para escribir una implementacin de la interfaz. Por ejemplo, la clase
AnonymousInnerClassTest en el listado 14.7 crea una clase interna annima que
es una implementacin de Printable.

Listado 14.7: utilizando una clase interna annima

interface Printable {
void print(String message);
}
public class AnonymousInnerClassTest 1{
public static void main(String[] args) {
Printable printer = new Printable() {
public void print(String message) {
System.out.println(message);
}
}; // Este es un punto y coma
printer.print("Msica de playa ");
}
}
Lo interesante aqu es que se crea una clase interna annima mediante la palabra
clave new seguida por lo que se ve como un constructor de la clase (en este caso
Printable() ). Sin embargo, nota que es imprimible y una interfaz no tiene un
constructor. Printable() es seguido por la aplicacin del mtodo de impresin.
Adems, tenga en cuenta que despus de la llave de cierre, se utiliza un punto y
coma para terminar la declaracin que crea una instancia de la clase interna
annima. Adems, tambin puede crear una clase interna annima extendiendo
una clase abstracto o concreto, como se demostr en el cdigo en el listado 14.8.

14.8: Listado utilizando una clase interna annima con una clase abstracta
abstract class Printable {
void print(String message) {
}
}
public class AnonymousInnerClassTest 1{
public static void main(String[] args) {
Printable printer = new Printable() {
public void print(String message) {
System.out.println(message);
}
}; // Este es un punto y coma
printer.print("Msica de playa ");
}
Nota
Las clases annimas se utilizan a menudo en aplicaciones Swing. Consulte el
Captulo 16, "Swinging superior" para ms detalles.
.

Potrebbero piacerti anche