2011-11-28 28 views
6

Tôi muốn đặt tất cả các thành viên String của một đối tượng thành một chuỗi rỗng nếu chúng là rỗng.Khởi tạo tất cả các thành viên String với một chuỗi rỗng

Mã giả:

foreach member in object { 
    if (member instanceof String and member == null) { 
     member = ''; 
    } 
} 

cách đơn giản nhất để đạt được điều đó là gì? Bất kỳ khung công cụ/công cụ nào mà tôi có thể sử dụng? Viết giải pháp của riêng tôi qua phản ánh?

+1

Vì mục đích gì? Sẽ dễ dàng hơn trong phương thức get() tương ứng, nếu bạn luôn gọi nó, hơn là ảnh hưởng đến giá trị thực. – EJP

+0

Các lớp được tạo bởi JAXB2, vì vậy tôi không muốn thay đổi chúng. – Sebi

+0

Nếu bạn đang sử dụng '.xsd' để xác định lược đồ cho JAXB2, bạn có thể xác định giá trị' default' trực tiếp trong '.xsd'. – ante

Trả lời

5
public static void setEmpty(Object object) throws IllegalArgumentException, IllegalAccessException { 
    Class<?> clazz = object.getClass(); 
    Field[] fields = clazz.getDeclaredFields(); 
    for (Field field : fields) { 
     if (String.class.equals(field.getType())) { 
      field.setAccessible(true); 
      if (field.get(object) == null) { 
       field.set(object, ""); 
      } 
     } 
    } 
} 
1

Bạn có thể sử dụng phản chiếu để liệt kê tất cả các trường của đối tượng và sau đó kiểm tra và thay đổi nó. Bạn có thể phải sửa đổi cấp truy cập, nếu chúng là riêng tư. Bạn có thể tìm thấy nhiều hướng dẫn về điều đó khi tìm kiếm trên Google, ví dụ: this one.

0

Cách khác là viết tiện ích tạo mã để đặt chuỗi trống cho thành viên của các đối tượng cụ thể.

0

Trong thiên về thiết kế tái sử dụng, bạn nên xem xét sử dụng một giá trị mặc định cho các giá trị null giống như API defaultString chung của Apache, một cái gì đó như thế này:

public String getValue(String value){ 
    return StringUtils.defaultString(value); 
} 

Bạn cũng có thể xem xét sử dụng defaultString(String str,String defaultStr) để bạn có thể lựa chọn thay đổi giá trị mặc định thành bất cứ điều gì nên có bất kỳ lý do nào làm như vậy.

StringUtils documentation

1

Cố gắng sử dụng AspectJ:

@Aspect 
public class StringHandler { 
    @Around("execution(String com....YourClass.*(*))") 
    public Object handle(ProceedingJoinPoint thisJoinPoint) throws Throwable { 
     String s = (String) thisJoinPoint.proceed(); 
     if (s == null){ 
      return ""; 
     } 
     return s; 
    } 
} 

này sẽ nhanh hơn trong thời gian chạy vì khía cạnh này sẽ được biên dịch để byte-code, khác phản ánh sẽ được sử dụng tại run- thời gian và làm chậm ứng dụng của bạn.

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