سؤال

أنا أكتب الرمز التوضيحي ل API الذي أنشأناه وأظل الركض في نفس المشكلة حيث أذكر نفسي، مرارا وتكرارا وأكثر من ذلك. أدرك بشكل مؤلم أن جافا من المقرر أن تضاف الإغلاق ولكن ليس لدي حق الوصول إليها الآن. هنا هو ما يتكرر في كل مكان وأود أن صندوقا فقط في الزاوية الصغيرة الخاصة:

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

حول الطريقة الوحيدة التي اعتقدت أن أذهب إليها هي تمرير Method في وظيفة تحمل معها منطق TRY-CART وتفويل كل شيء في وظيفة أخرى مثل:

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

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

لكنها تبدو قبيحة وتحمل معها الكثير من الثنائيات. هل هناك طريقة أسهل لإنشاء وظائف في جافا؟

هل كانت مفيدة؟

المحلول

في Java، هذا أمر صعب للغاية لأنه لا يوجد دعم من الدرجة الأولى للوظائف (على عكس عباءة أو Scala وربما أخرى).

ومع ذلك، يمكنك مغرور العملية في كائن:

interface Function<R, T> {

     R call(T... input);
}

ثم إعادة المرسل Foo كما:

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

حالة اختبار:

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

نصائح أخرى

يحاول lambdaj.. وبعد يسمح بإضافة بعض الشيء من FP إلى Java بطريقة خفيفة وقابلة للقراءة. على وجه الخصوص في هذا إغلاق Wiki Page. يمكنك العثور على مثال مشابه جدا لما تحاول تحقيقه،

من الواضح أن هذا هو مكالمتك، ولكن مع معظم عمليات طب واجهة برمجة التطبيقات التي استخدمتها، أفضل التنسيق الطويل الذي لديك في الأعلى. بعد أن أنظر إلى التعليمات البرمجية، عادة ما أقوم بالنسخ واللصق للتحقق من Works API كما أعتقد أنه يقوم بذلك ثم قم بتعديله من هناك. تغيير الشكل لإخفاء بعض القطع المتكررة هو بالتأكيد ما تريد القيام به لتطوير OO لكنني أعتقد أن هذا الرمز التجريبي كيندا هذا شيء يفهمه "آلهة الكود النظيف" :-).

لا توجد طريقة للقيام بذلك في Java، ولكن حاول استخدام Groovy إذا كان ذلك ممكنا بالنسبة لك. الخيار الآخر الذي يمكن أن يكون لديك التفاف مماثلة يستخدم الجانب. يرى جيوب.

لقد تعلمت الطريقة التي يتم بها ذلك في Java هي إنشاء واجهة تحتوي على طريقة واحدة. في التعليمات البرمجية التي تستخدمها الفئات التي تنفذ هذه الواجهة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top