2010-02-05 32 views
9

Tôi đang viết mã demo cho API mà chúng tôi đã tạo và tôi tiếp tục chạy vào cùng một vấn đề mà tôi lặp lại bản thân mình, hơn và hơn nauseum quảng cáo. Tôi đau đớn nhận thức được rằng Java được lên kế hoạch để có đóng cửa được thêm vào nhưng tôi không có quyền truy cập vào chúng ngay bây giờ. Đây là những gì được lặp lại trên tất cả các nơi mà tôi muốn chỉ hộp vào đó là cái góc nhỏ riêng:Chức năng soạn thảo trong Java?

public BarObj Foo(Double..._input){ 
    try{ 
     //things that vary per function 
     //but everything else... 
    } catch(NullException _null){ 
     m_Logger.error("Null error exception caught in Blah::Foo"); 

     return null; 
    } catch(Exception ex){ 
     m_Logger.error(ex.getMessage()); 

     return null; 
    } 
} 

Về cách duy nhất tôi đã suy nghĩ để đi xung quanh này là bằng cách đi qua một Method vào một chức năng mà mang theo nó logic cố gắng nắm bắt và gói tất cả lên trong một chức năng như vậy:

public BarObj MyFunc(Double..._input){ 
    return compose("MyLogic",_input); 
} 

private BarObj MyLogic(Double..._input) 
    throws Exception{ 
    //stuff 
} 

nhưng nó trông xấu xí và mang theo nó rất nhiều boilerplate. Có cách nào dễ dàng hơn để soạn các hàm trong Java?

+0

Tôi nghĩ rằng một số các đề xuất phần mở rộng cho đóng cửa trong java trông thậm chí xấu hơn. – DerMike

Trả lời

8

trong Java điều này là rất khó vì không có hỗ trợ lớp học đầu tiên cho các chức năng (không giống như clojure hoặc scala và có lẽ khác).

Tuy nhiên, bạn có thể đóng gói hoạt động trong một đối tượng:

interface Function<R, T> { 

    R call(T... input); 
} 

sau đó Refactor Foo như:

static <R, T> R runFunction(Function<R, T> function, T ... input){ 
    try{ 
     return function.call(input); 
    } catch(NullPointerException _null){ 
     m_Logger.error("Null error exception caught in Blah::Foo"); 
     return null; 
    } catch(Exception ex){ 
     m_Logger.error(ex.getMessage()); 
     return null; 
    } 
} 

testcase:

class SumDoubles implements Function<Double, Double> { 

    @Override 
    public Double call(Double... input) { 
     Double sum = 0.0; 

     for (Double d : input) { 
      sum += d; 
     } 

     return sum; 
    } 
} 

@Test 
public void sum() { 
    Double sum = runFunction(new SumDoubles(), 1.0, 2.0, 3.0); 
    assertThat(sum, is(6.0)); 
} 
+0

Bạn có gợi ý rằng những điều này được thực hiện như là các lớp riêng trong lớp 'Foo' lớn hơn? Tôi nghĩ đó là một mối quan tâm khá tốt đẹp. Btw, tôi yêu Scala. – wheaties

2

Hãy thử lambdaj. Nó cho phép thêm một chút FP vào java theo một cách khá nhẹ và dễ đọc. Cụ thể trong số closure wiki page này, bạn có thể tìm thấy ví dụ rất giống với những gì bạn đang cố gắng đạt được,

0

Đây rõ ràng là cuộc gọi của bạn, nhưng với hầu hết các trình diễn API tôi đã sử dụng, tôi thích định dạng dài hơn hàng đầu. Sau khi tôi xem xét mã, tôi thường sao chép và dán để xác minh API hoạt động như tôi nghĩ sau đó sửa đổi nó từ đó. Thay đổi định dạng để ẩn một số phần lặp đi lặp lại là chắc chắn những gì bạn muốn làm cho phát triển OO nhưng tôi nghĩ rằng mã demo này là một cái gì đó mà các 'thần mã sạch' sẽ hiểu :-).

0

Không có cách nào để làm điều này trong java, nhưng hãy thử sử dụng groovy nếu nó có thể cho bạn. Các tùy chọn khác bạn có thể có gói tương tự là sử dụng khía cạnh. xem aspectj.

0

Tôi đã học cách thực hiện điều này trong Java là tạo một giao diện có một phương thức. Trong mã của bạn, bạn sử dụng các lớp thực hiện giao diện đó.

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