我有以下类,你会看到它有一个相当冗余的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,我有时会以错误的方式将其输出。
我想我需要做的是以某种方式将对象类型作为变量传递,然后使用该变量来确定如何投射。这可能吗?如果是这样,怎么样?如果没有,那会是一个好的解决方案吗?
答案 0 :(得分:5)
这可能会奏效:
public void formatNameAndAddress(JspWriter out) throws java.io.IOException {
formatNameAndAddress(new PrintWriter(out));
}
答案 1 :(得分:1)
你用这些方法弄乱了两个不同的任务,打破了专业化的OO原则。也就是说,你有一些方法负责格式化两种类型的字符串之一......并负责将它们发送到两种类型的输出目标之一。
更好的方法可能是让您的方法更专业化。也就是说,让他们只负责构建“名称”字符串或“名称和地址”字符串...并返回String
作为方法的返回类型。
在您调用这些方法的代码中,您显然已经拥有JspWriter
或PrintWriter
对象...因为您现在将其作为方法参数传递。因此,将该对象保留在代码中的位置会更简洁,并打印出由您的专用输出无关方法返回的String
。
答案 2 :(得分:0)
如果您想将对象强制转换为正确的Writer,您可以尝试以下方法:
private void genericFormatNameAndAddress(Object out){
if (obj instanceof Printwriter){
//cast to printwriter
} else {
//cast to JspWriter
}
Barkers解决方案似乎更适合,因为Printwriter可以用JspWriter构建。
答案 3 :(得分:0)
JspWriter
和PrintWriter
都是java.io.Writer
的子类。由于您不使用任何特定于两者的任何功能,您可以将该方法声明为java.io.Writer
:
public void formatNameAndAddress(Writer out) throws java.io.IOException
{
[...]
然后根据需要传递JspWriter
或PrintWriter
。
修改:如果没有实际修改代码,这将无效,因为正如其他人所指出的,Writer
没有print
和println
方法,而JspWriter
和PrintWriter
都提供它们。