6

我有以下类,正如您将看到的那样,它有一个相当多余的 formatNameAndAddress 方法:

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,有时我会以错误的方式转换它。

我想我需要做的是以某种方式将对象类型作为变量传递,然后使用该变量来确定如何转换。这可能吗?如果是这样,怎么做?如果没有,什么是好的解决方案?

4

4 回答 4

5

这可能会起作用:

public void formatNameAndAddress(JspWriter out) throws java.io.IOException {
    formatNameAndAddress(new PrintWriter(out));
}
于 2010-10-03T12:48:39.447 回答
1

您有点用这些方法混淆了两个不同的任务,并打破了专门化的 OO 原则。也就是说,您有负责格式化两种类型的字符串之一的方法......并负责将它们发送到两种类型的输出目标之一。

更好的方法可能是使您的方法更专业。也就是说,让他们只负责构建“名称”字符串或“名称和地址”字符串......并String作为方法的返回类型返回。

在您调用这些方法的代码中,您显然已经有了一个JspWriter或一个PrintWriter对象......因为现在您将它作为方法参数传递。因此,简单地将该对象留在代码中的位置,并让它打印出String由您的专用输出不可知方法返回的对象会更干净。

于 2010-10-03T12:52:02.983 回答
0

如果您想将对象转换为正确的 Writer,您可以尝试以下操作:

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

Barkers 解决方案似乎更适合,因为可以从 JspWriter 构建 Printwriter。

于 2010-10-03T13:01:55.323 回答
0

JspWriter和都是PrintWriter的子类java.io.Writer。由于您不使用任何特定于两者的任何功能,因此您可以将该方法声明为采用java.io.Writer

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

然后根据需要传递一个JspWriterPrintWriter

编辑:如果不实际修改代码,这将无法工作,因为正如其他人所指出的那样,Writer没有printandprintln方法,而JspWriterandPrintWriter都提供了它们。

于 2010-10-03T14:09:42.163 回答