2009-12-29 20 views
7

tôi bị bệnh của encapsuling mỗi cuộc gọi của asType với try/catch khối như:Làm thế nào để quá tải một số chuyển đổi Groovy Type để tránh try/catch của NumberFormatException?

def b = "" 
def c 
try { 
    c = b as Integer 
} 
catch (NumberFormatException) { 
    c = null 
} 
println c 

thay vào đó tôi muốn viết trong mã của tôi như sau:

def b = "" 
def c = b as Integer 

và nếu b là không tốt định dạng , sau đó tôi muốn có null được chỉ định cho c

Vậy làm cách nào để tôi có thể quá tải hành vi mặc định này cho asType nhà điều hành?

Có rủi ro không nếu tôi làm điều đó cho toàn bộ ứng dụng Grails của mình? Hoặc là giải pháp tốt nhất để đơn giản tạo ra một phương pháp của riêng tôi (như asTypeSafe) và gọi nó? Do Groovy/Grails có một số chỉnh sửa cấu hình liên quan đến chuyển đổi Groovy Type không?

EDIT (đối với người quan tâm đến câu trả lời thực hiện) Dựa trên câu trả lời được chấp nhận, tôi đã thêm đoạn mã sau vào tập tin bootstrap.groovy của tôi và nó hoạt động hoàn hảo.

String.metaClass.asTypeSafe = {Class c -> 
    try { 
     delegate.asType(c) 
    } 
    catch (Exception) { 
     return null 
    } 
} 

và tôi gọi nó là như sau:

def myNum = myStr.asTypeSafe(Integer) 

Trả lời

9

Bạn có thể ghi đè lên hành vi mặc định bằng cách cung cấp một thực hiện asType mới. Hãy chắc chắn rằng bạn lưu một cái cũ, và gọi nó cho các lớp khác mà bạn không muốn xử lý chính mình. Ví dụ:

oldAsType = String.metaClass.getMetaMethod("asType", [Class] as Class[]) 
String.metaClass.asType = { Class c -> 
    if (c == Integer) { 
     delegate.isInteger() ? delegate.toInteger() : null 
    } else { 
     oldAsType.invoke(delegate, c) 
    } 
} 

Vì đây là một ý tưởng hay, hãy nhớ rằng rất nhiều đối tượng sẽ sử dụng Strings và họ có thể gọi chuyển đổi này và dựa vào ngoại lệ. Bạn đang rối tung với mọi thứ ở mức độ khá thấp.

Đối tượng miền Grails sẽ thực hiện rất nhiều việc chuyển đổi kiểu nặng nếu bạn chuyển đối tượng params từ bộ điều khiển, nhưng tôi không nghĩ rằng nó có bất kỳ loại chỉnh sửa toàn cục nào cho loại điều này.

+0

Thx! Đây chính xác là những gì tôi cần. Tôi thực sự có thể thêm một phương thức mới vào lớp String (như "asTypeSafe") thay vì ghi đè asType theo đề xuất của bạn. Ngoài ra, bạn viết và gọi loại mã này trong ứng dụng Grails ở đâu? Trong bootstap? – fabien7474

+1

Có, bootstrap sẽ là đúng nơi. – ataylor

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