2010-10-03 9 views
6

tengo la clase siguiente, que como verán tiene más bien un método en lugar formatNameAndAddress redundante:En Java, ¿puedo consolidar dos funciones similares donde usa JspWriter y el otro PrintWriter?

package hu.flux.helper; 
import java.io.PrintWriter; 

import javax.servlet.jsp.JspWriter; 

// A holder for formatting data 
public class NameAndAddress 
{ 
public String firstName; 
public String middleName; 
public String lastName; 
public String address1; 
public String address2; 
public String city; 
public String state; 
public String zip; 

// Print out the name and address. 
public void formatNameAndAddress(JspWriter out) 
    throws java.io.IOException 
    { 
    out.println("<PRE>"); 
    out.print(firstName); 

    // Print the middle name only if it contains data. 
    if ((middleName != null) && (middleName.length() > 0)) 
    {out.print(" " + middleName);} 

    out.println(" " + lastName); 

    out.println(" " + address1); 

    if ((address2 != null) && (address2.length() > 0)) 
    out.println(" " + address2); 

    out.println(city + ", " + state + " " + zip); 
    out.println("</PRE>"); 
    } 

public void formatName(PrintWriter out) 
{ 
    out.println("<PRE>"); 
    out.print(firstName); 

    // Print the middle name only if it contains data. 
    if ((middleName != null) && (middleName.length() > 0)) 
    {out.print(" " + middleName);} 

    out.println(" " + lastName); 

    out.println(" " + address1); 

    if ((address2 != null) && (address2.length() > 0)) 
    out.println(" " + address2); 

    out.println(city + ", " + state + " " + zip); 
    out.println("</PRE>"); 
} 
} 

me gustaría volver a escribir la clase que se utiliza como un método genérico:

 // Print out the name and address. 
private void genericFormatNameAndAddress(Object out) 
{ 
    out.println("<PRE>"); 
    out.print(firstName); 

    // Print the middle name only if it contains data. 
    if ((middleName != null) && (middleName.length() > 0)) 
    {out.print(" " + middleName);} 

    out.println(" " + lastName); 

    out.println(" " + address1); 

    if ((address2 != null) && (address2.length() > 0)) 
    out.println(" " + address2); 

    out.println(city + ", " + state + " " + zip); 
    out.println("</PRE>"); 
} 

Pero no puedo hacer esto exactamente así porque Object no tiene los métodos print() e println(). Si lanzo el resultado a JspWriter o PrintWriter, a veces lo lanzaré de la manera incorrecta.

Imagino que lo que tengo que hacer es de alguna forma pasar el tipo de objeto como una variable y luego usar la variable para determinar cómo lanzarlo. es posible? ¿Si es así, cómo? Si no, ¿cuál sería una buena solución?

Respuesta

5

Esto probablemente va a funcionar:

public void formatNameAndAddress(JspWriter out) throws java.io.IOException { 
    formatNameAndAddress(new PrintWriter(out)); 
} 
+0

Eso funciona, ¡salud! –

+0

Sabiendo que podía convertir JspWriter a PrintWriter, traté de llevar mi revisión un poco más lejos (incorporando también la sabiduría de Steve) ... Sin embargo, ahora tengo un nuevo problema sobre el que pregunto en http: // stackoverflow.com/questions/3850079/shouldnt-a-method-que-recibe-java-lang-object-as-input-also-receive-javax-ser –

+0

@Brian, no, no se pudo convertir, 'JspWriter' no es una subclase de 'PrintWriter'. –

1

Estás tipo de embrollo dos tareas diferentes con estos métodos, y rompiendo el principio de especialización OO. Es decir, tiene métodos que son responsables de formatear uno de los dos tipos de cadenas ... Y es responsable de enviarlos a uno de los dos tipos de objetivos de salida.

Un mejor enfoque podría ser hacer que sus métodos sean más especializados. Es decir, que SOLO sean responsables de crear una cadena "Nombre" o una cadena "Nombre y dirección" ... y devolver String como el tipo de devolución de los métodos.

En el punto en el código donde está invocando estos métodos, obviamente ya tiene un objeto JspWriter o PrintWriter ... porque en este momento lo está pasando como un argumento de método. Por lo tanto, sería más simple simplemente dejar ese objeto donde está en el código y hacer que imprima el String que devuelve su método especializado independiente de la salida.

+0

En realidad, ambos tienen el mismo objetivo de salida. Se está llamando a un método desde un servlet, y el otro desde una página JSP, que entiendo que en realidad se cambió a un servlet antes de ser atendido. Pero, creo que entiendo lo que sugieres. Saludos por la respuesta! –

0

Si desea enviar el objeto al escritor correcta puede intentar algo como:

private void genericFormatNameAndAddress(Object out){ 
    if (obj instanceof Printwriter){ 
     //cast to printwriter 
    } else { 
     //cast to JspWriter 
    } 

solución Barker parece ser más adecuado debido a que un PrintStream puede ser construido a partir de un JspWriter.

+0

Saludos por la respuesta, pero no creo que realmente haga lo que estoy buscando, ya que simplemente haría el código más largo y más complicado si lo revisara antes de cada instancia de casting y no habría muchas ventajas de aprobar "salir" de esta función si solo se dividiera y procesara por separado nuevamente. –

0

Ambos JspWriter y PrintWriter son subclases de java.io.Writer. Puesto que no se utiliza ninguna funcionalidad que es específica para cualquiera de los dos, se puede declarar el método como tomar una java.io.Writer:

public void formatNameAndAddress(Writer out) throws java.io.IOException 
{ 
    [...] 

A continuación, pasar un JspWriter o PrintWriter según sea necesario.

Editar: Esto no funcionará sin tener que modificar el código, ya que, como se ha señalado por otros, Writer no tiene print y println métodos, mientras que JspWriter y PrintWriter tanto ellos proporcionan.

+0

'println' no está en' Writer', está tanto en 'JspWriter' como' PrintWriter', pero sigue siendo específico para cada una de estas clases. –

+0

Acabo de probar esto, pero esta firma no parece capturar JspWriter. He estado explorando un enfoque similar y he publicado la pregunta resultante de este hasta ahora desaventurado para http://stackoverflow.com/questions/3850079/shouldnt-a-method-that-receives-java-lang-object- as-input-also-receive-javax-ser –

Cuestiones relacionadas