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

あなたは、これらの方法で2つの異なるタスクを混乱させ、特殊化のOOの原則を破っています。つまり、2種類の文字列のいずれかをフォーマットするメソッドと、2種類の出力ターゲットのいずれかに送信するメソッドがあります。

より良いアプローチは、メソッドをより専門的にすることかもしれません。つまり、「Name」文字列または「Name andAddress」文字列の作成のみを担当しString、メソッドの戻りタイプとして返​​すようにします。

これらのメソッドを呼び出すコードの時点で、明らかにすでにJspWriterまたはPrintWriterオブジェクトがあります...現在はメソッド引数として渡しているためです。Stringしたがって、そのオブジェクトをコード内の場所に残して、出力に依存しない特殊なメソッドによって返されるオブジェクトを出力する方がクリーンです。

于 2010-10-03T12:52:02.983 に答える
0

オブジェクトを正しいライターにキャストしたい場合は、次のようなことを試すことができます。

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

PrintwriterはJspWriterから構築できるため、Barkersソリューションの方が適しているようです。

于 2010-10-03T13:01:55.323 に答える
0

JspWriterとは両方ともPrintWriterのサブクラスですjava.io.Writer。2つのいずれにも固有の機能を使用しないため、メソッドを次のように宣言できますjava.io.Writer

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

次に、必要に応じてJspWriterまたはPrintWriterを渡します。

編集:他の人が指摘しているように、メソッドWriterがないので、実際にコードを変更しないとこれは機能しませんが、両方がそれらを提供します。printprintlnJspWriterPrintWriter

于 2010-10-03T14:09:42.163 に答える