2010-10-03 41 views
6

Tôi có lớp sau, như bạn sẽ thấy có khá một phương pháp formatNameAndAddress khá dư thừa:Trong Java, tôi có thể hợp nhất hai chức năng tương tự khi sử dụng JspWriter và PrintWriter khác không?

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

Tôi muốn viết lại lớp để sử dụng một phương pháp chung chung như:

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

Nhưng, tôi không thể làm điều này chính xác như thế này bởi vì Object không có phương thức print() và println(). Nếu tôi đưa đầu ra vào JspWriter hoặc PrintWriter, đôi khi tôi sẽ truyền nó sai.

Tôi tưởng tượng những gì tôi cần làm là bằng cách nào đó chuyển loại đối tượng dưới dạng biến và sau đó sử dụng biến để xác định cách truyền. Điều này có thể không? Nếu vậy, làm thế nào? Nếu không, đâu là giải pháp tốt?

Trả lời

5

Điều này có lẽ sẽ làm việc:

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

Hoạt động, chúc mừng! –

+0

Biết rằng tôi có thể truyền JspWriter sang PrintWriter, tôi đã cố gắng sửa đổi thêm một chút (cũng kết hợp với sự khôn ngoan của Steve) ... Tuy nhiên, bây giờ tôi có một vấn đề mới mà tôi hỏi tại http: // stackoverflow.com/questions/3850079/shouldnt-a-method-đó-nhận-java-lang-object-as-input-cũng-nhận-javax-ser –

+0

@Brian, không bạn không thể truyền, 'JspWriter' không một lớp con của 'PrintWriter'. –

1

Bạn đang loại muddling hai nhiệm vụ khác nhau với phương pháp này, và phá vỡ các nguyên tắc OO chuyên môn. Tức là, bạn có các phương thức chịu trách nhiệm định dạng một trong hai loại chuỗi ... VÀ chịu trách nhiệm gửi chúng đến một trong hai loại mục tiêu đầu ra.

Cách tiếp cận tốt hơn có thể là làm cho các phương pháp của bạn chuyên biệt hơn. Tức là, để họ CHỈ chịu trách nhiệm xây dựng một chuỗi "Tên" hoặc chuỗi "Tên và địa chỉ" ... và trả về String làm kiểu trả về của phương thức. Tại các điểm trong mã nơi bạn đang gọi các phương thức này, bạn rõ ràng đã có một đối tượng JspWriter hoặc PrintWriter ... bởi vì ngay bây giờ bạn đang chuyển nó làm đối số phương thức. Vì vậy, nó sẽ được sạch hơn để chỉ đơn giản là để lại rằng đối tượng mà nó có trong mã, và có nó in ra các String được trả lại bởi phương pháp đầu ra chuyên ngành thuyết bất khả tri của bạn.

+0

Trên thực tế, cả hai đều có cùng mục tiêu đầu ra. Một phương thức đang được gọi từ một servlet và một phương thức khác từ một trang JSP mà tôi hiểu thực sự được thay đổi thành một servlet trước khi được phục vụ. Nhưng, tôi nghĩ rằng tôi hiểu những gì bạn đề xuất. Chúc mừng cho phản ứng! –

0

Nếu bạn muốn cast đối tượng để Writer chính xác bạn có thể thử một cái gì đó như:

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

giải pháp Barkers có vẻ là phù hợp hơn vì một PrintWriter có thể được xây dựng trên một JspWriter.

+0

Chúc mừng cho phản ứng nhưng tôi không nghĩ điều đó thực sự làm những gì tôi đang tìm kiếm vì nó sẽ làm cho mã dài hơn và phức tạp hơn nếu tôi kiểm tra trước mỗi lần đúc và sẽ không có nhiều thuận lợi khi vượt qua "out" để chức năng này nếu nó sẽ chỉ được tách ra và xử lý một cách riêng biệt một lần nữa. –

0

Cả hai JspWriterPrintWriter là các lớp con của java.io.Writer. Kể từ khi bạn không sử dụng bất kỳ chức năng mà là cụ thể cho bất kỳ hai, bạn có thể khai báo các phương thức như tham gia một java.io.Writer:

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

Sau đó, thông qua một JspWriter hoặc PrintWriter theo yêu cầu.

Edit: này sẽ không làm việc mà không thực sự sửa đổi mã vì, như đã chỉ ra bởi những người khác, Writer không có printprintln phương pháp, trong khi JspWriterPrintWriter cả cung cấp cho họ.

+0

'println' không có trong 'Writer', nó nằm trong' JspWriter' và 'PrintWriter' nhưng nó vẫn còn đặc trưng cho từng lớp này. –

+0

Chỉ cần thử này, nhưng chữ ký này dường như không bắt JspWriter. Tôi đã khám phá một cách tiếp cận tương tự và đã đăng câu hỏi do việc này gây khó khăn cho http://stackoverflow.com/questions/3850079/shouldnt-a-method-that-receives-java-lang-object- as-input-also-receive-javax-ser –

Các vấn đề liên quan