2010-04-02 28 views
16

Vì vậy, tôi có chức năng định dạng ngày để ép buộc thành DateType {CURRENT, START, END} điều gì sẽ là cách tốt nhất để xử lý giá trị trả lại với trường hợp sử dụng lệnh chuyển đổiNém ngoại lệ so với giá trị null trả về bằng lệnh chuyển đổi

public static String format(Date date, DateType datetype) { 
    ..validation checks 

    switch(datetype){ 
    case CURRENT:{ 
     return getFormattedDate(date, "yyyy-MM-dd hh:mm:ss"); 
    }    
    ... 
    default:throw new ("Something strange happend"); 
    } 

} 

HOẶC ném excpetion vào cuối

public static String format(Date date, DateType datetype) { 
      ..validation checks 

      switch(datetype){ 
      case CURRENT:{ 
       return getFormattedDate(date, "yyyy-MM-dd hh:mm:ss"); 
      }    
      ... 
      } 

       //It will never reach here, just to make compiler happy 
     throw new IllegalArgumentException("Something strange happend");  
     } 

HOẶC trả về null

public static String format(Date date, DateType datetype) { 
      ..validation checks 

      switch(datetype){ 
      case CURRENT:{ 
       return getFormattedDate(date, "yyyy-MM-dd hh:mm:ss"); 
      }    
      ... 
      } 

      return null; 
} 

Thực hành tốt nhất ở đây là gì? Ngoài ra tất cả các giá trị enum sẽ được xử lý trong trường hợp tuyên bố

+1

Nếu bạn có điều kiện không bao giờ xảy ra, tôi sẽ sử dụng AssertionError. –

+0

Cảm ơn AssertionError có ý nghĩa hơn nhiều so với IllegalArgumentException – Greg

Trả lời

18

Ném ngoại lệ, vì đây là trường hợp ngoại lệ.

Và ném nó ra ngoài switch, nó sẽ dễ đọc hơn. Nếu không, có vẻ như "trường hợp mặc định là ngoại lệ".

+7

Ngoài ra, việc ném ngoại lệ ra ngoài báo cáo chuyển đổi sẽ cho phép cảnh báo biên dịch nếu bạn không bao trả tất cả các giá trị enum như trường hợp trong switch (hoặc nếu enum sau đó được mở rộng) . – ILMTitan

1

Tôi sẽ đi với phương pháp đầu tiên (nhưng với IllegalArgumentException như trong cách tiếp cận thứ hai của bạn). Bạn nên bao gồm một tuyên bố mặc định để bảo vệ chống lại các trường hợp khi ai đó modifys (mở rộng) enum của bạn. Đặt ngoại lệ trong câu lệnh mặc định làm cho người đọc biết rằng mã không bao giờ được phép vượt qua câu lệnh switch. Nếu không, họ sẽ phải kiểm tra xem thực sự tất cả các giá trị enum có trong switch hay không.

1

Trường hợp ngoại lệ, vì bạn có thể tuân thủ nhiều hơn đối với cha mẹ so với một lần trả về đơn lẻ có thể. Thông thường bạn sử dụng Exceptions, nơi chúng tồn tại (C++), và trả về các giá trị không có (C).

9

Tôi nghĩ rằng throw new IllegalArgumentException("Something strange happend") là công cụ tốt nhất.

Sử dụng null sẽ chỉ presumibly gây ra ở đâu đó NullPointerException khi bạn sử dụng giá trị trả về nhưng nó sẽ được ít thông tin hơn nuôi một ngoại lệ cụ thể mô tả các vấn đề!

Và bạn biết: các lỗi rõ ràng = phát triển tốt hơn.

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