在Java中,我可以巩固在那里使用的JspWriter和其他PrintWriter的两个类似的功能呢?

StackOverflow https://stackoverflow.com/questions/3849768

我有以下类,如你将看到具有相当相当冗余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>");
 }

不过,我不能这样做完全一样,因为对象不具备的print()和println()方法。如果我投输出要么的JspWriter或PrintWriter的,我会有时浇铸了错误的方式。

我想什么,我需要做的是某种方式传递对象类型的变量,然后使用变量来确定如何投。这可能吗?如果是这样,怎么样?如果不是这样,这将是一个很好的解决方案?

有帮助吗?

解决方案

这将可能工作:

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

其他提示

您是那种得过且过两个不同的任务使用这些方法,并打破专业化的原则,面向对象的。也就是说,你有哪些是负责格式化两种类型的琴弦的一个方法...以及负责将它们发送到两种类型的输出目标之一。

有一个更好的办法可能是让你的方法更加专业化。也就是说,让他们只负责建设一个“名称”字符串或“名称及地址”串......和方法的返回类型的返回String

在代码中你调用这些方法的点,你显然已经有一个JspWriterPrintWriter对象......因为现在你把它当作一个方法参数。因此,这将是清洁,以简单地离开该对象的地方是在代码,并将其打印出来,并以您的专业输出无关方法返回的String

如果您要将对象转换为正确的作家,你可以尝试这样的:

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

巴克溶液似乎是更适合,因为一个PrintWriter可以一个的JspWriter的构造进行。

两者JspWriterPrintWriterjava.io.Writer的子类。由于不使用专用于任何两个的任何功能,可以声明的方法,采取了java.io.Writer

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

然后根据需要通过一个或JspWriter PrintWriter

编辑::此而不真正修改代码,因为,正如有人指出,Writer没有printprintln方法是行不通的,而JspWriterPrintWriter都为他们提供

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top