2010-10-03 1 views
6

У меня есть следующий класс, который, как вы увидите, имеет довольно довольно избыточный метод formatNameAndAddress:В Java можно объединить две аналогичные функции, где используется JspWriter и другой 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>"); 
} 
} 

Я хотел бы переписать класс использовать общий метод, как:

 // 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>"); 
} 

Но я не могу сделать это точно так, потому что Object не имеет методов print() и println(). Если я передам вывод в JspWriter или PrintWriter, иногда я ошибаюсь.

Я представляю, что мне нужно сделать, так или иначе передать тип объекта как переменную, а затем использовать переменную, чтобы определить, как отличать. Это возможно? Если да, то как? Если нет, то что было бы хорошим решением?

ответ

5

Это вероятно, будет работать:

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

Это работает, приветствует! –

+0

Зная, что я мог бы нарисовать JspWriter для PrintWriter, я попытался сделать мой пересмотр немного дальше (также включая мудрость Стива) ... Однако теперь у меня есть новая проблема, о которой я спрашиваю в http: // stackoverflow.com/questions/3850079/shouldnt-a-method-that-receive-java-lang-object-as-input-also-receive-javax-ser –

+0

@Brian, вы не можете отличить, 'JspWriter' не подкласс «PrintWriter». –

1

Вы вид путает две различные задачи с помощью этих методов, а также нарушение принципа ОО специализации. То есть у вас есть методы, которые отвечают за форматирование одного из двух типов строк ... И отвечают за отправку их одному из двух типов целевых объектов вывода.

Лучший подход может заключаться в том, чтобы сделать ваши методы более специализированными. То есть им нужно ТОЛЬКО отвечать за построение строки «Имя» или строки «Имя и адрес» ... и вернуть String в качестве возвращаемого типа методов.

В точке кода, где вы вызываете эти методы, у вас, очевидно, уже есть объект JspWriter или PrintWriter ... потому что прямо сейчас вы передаете его как аргумент метода. Поэтому было бы проще просто оставить этот объект там, где он находится в коде, и распечатать его String, который будет возвращен вашим специализированным методом вывода-агностика.

+0

На самом деле, оба они в конечном итоге имеют одну и ту же выходную цель. Один метод вызывается из сервлета, а другой из страницы JSP, который, как я понимаю, фактически заменен на сервлет, прежде чем он будет обслуживаться. Но, я думаю, я понимаю, что вы предлагаете. Приветствия за ответ! –

0

Если вы хотите, чтобы привести объект к нужному Writer вы можете попробовать что-то вроде:

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

решения Barkers, кажется, лучше всего подходит, так как PrintWriter может быть построен из JspWriter.

+0

Приветствия за ответ, но я не думаю, что это действительно сделало бы то, что я искал, потому что это просто сделало бы код более длинным и сложным, если бы я проверил перед каждым экземпляром кастинга, и не было бы особого шанса пройти мимо «out» к этой функции, если она будет только разделяться и обрабатываться отдельно снова. –

0

Оба JspWriter и PrintWriter являются подклассами java.io.Writer. Поскольку вы не используете какие-либо функциональные возможности, характерные для любой из этих двух, вы можете объявить метод как взятие java.io.Writer:

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

Затем пройти JspWriter или PrintWriter по мере необходимости.

Edit: Это не будет работать без фактического изменения кода, поскольку, как указывалось другими, Writer не print и println методы, в то время как JspWriter и PrintWriter оба обеспечивают их.

+0

'println' не находится в' Writer', это как в 'JspWriter', так и' PrintWriter', но он по-прежнему зависит от каждого из этих классов. –

+0

Просто попробовал это, но эта подпись, похоже, не улавливает JspWriter. Я изучал аналогичный подход и опубликовал вопрос, связанный с этим, таким образом, до недавнего времени до http://stackoverflow.com/questions/3850079/shouldnt-a-method-that-receives-java-lang-object- а-вход-и-получить-javax-Ser –