سؤال

أنا لا أقصد تجميع الأخطاء لأنني قدمت جملة خطأ أو ما شابه ذلك.في C++ يمكننا إنشاء تجميع أخطاء وقت بناء على الشروط كما في المثال التالي:

template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};

#define STATIC_CHECK(expr, msg) { CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }

int main(int argc, char* argv[])
{
    STATIC_CHECK(false, Compile_Time_Failure);
    return 0;
}

في VS 2005 هذا الناتج:

------ Build started: Project: Test, Configuration: Debug Win32 ------
Compiling...
Test.cpp
f:\temp\test\test\test.cpp(17) : error C2079: 'ERROR_Compile_Time_Failure' uses undefined struct 'CompileTimeError<__formal>'
        with
        [
            __formal=0
        ]
Build log was saved at "file://f:\temp\Test\Test\Debug\BuildLog.htm"
Test - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

هل هناك أي طريقة لتحقيق ذلك في جافا ؟

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

المحلول

ليس هناك طريقة للقيام بذلك في جافا, لا في نفس الأمر كما في C++.

يمكنك استخدام الشروح, وتشغيل apt قبل أو بعد تجميع للتحقق من الشروح.

على سبيل المثال:

@MyStaticCheck(false, "Compile Time Error, kind-of")
public static void main(String[] args) {
    return;
}

ثم الكتابة الخاصة بك AnnotationProcessorFactory التي بدت @MyStaticCheck الشروح, و لا شيء مع الحجج.

ملاحظة:أنا لم ألعب كثيرا مع apt, لكن الوثائق يجعلها تبدو مثل هذا جدا القيام بها.

نصائح أخرى

لا توجد وسيلة لإنتاج أي أعمال تقوم على تجميع الوقت المنطق في جافا من دون استخدام أداة منفصلة.من الناحية الفنية ، ممكن استخدام C قبل المعالج في جافا, ولكن عليك أن تكون حذرا من المدمج في الافتراضات الأساسية في اللغة.إذا كنت سوف تجد طريقة أفضل لإنجاز كل ما هو كنت تحاول القيام به مع هذا ترجمة في الوقت الخطأ.إذا لزم الأمر يمكنك حتى كتابة الخاصة بك قبل المعالج (ربما باستخدام APT) إذا كان حقا لذلك لا مفر منه.

كما مات السمان الرد أعلاه, شروح, جنبا إلى جنب مع XDoclet, هي مناسبة لتلبية الاحتياجات الخاصة بك.أن مجموعات يسمح قليلا جدا من تجهيزها ، رمز جيل ، إلخ.

على الرغم من طرح السؤال منذ بعض الوقت ، قررت بعد جوابي لأني حللت (إلى حد ما) قليلا من مشكلة مماثلة.

معين من المهمة تتطلب اثنين من تطبيقات مختلفة مع وظيفة تعيين أن تكون مبنية من جوهر واحد المكتبة (غير المستخدمة الأشياء أن تكون غير مرتبطة).اختيار وظيفة مجموعة من public static final boolean أعلام.المشكلة هي أنني أريد أن تضمن في كل من التطبيقات التي بنيت مع المناسبة العلم في مكتبة الأساسية.و في حالة غير لائق وظائف تمكين التطبيق لا ينبغي أن تجمع إعطاء وقت الترجمة خطأ.

الحل الوحيد لقد وجدت حتى الآن هو أن تعلن في المكتبة النهائي المتغيرات جنبا إلى جنب مع الأعلام: public static final int functionSet1 = 0;, ، وما إلى ذلك.

في تطبيق حزمة أضفت دمية الدرجة مع الفحص

ConditionalBuild.functionSet1 = 1;

من كل functionSetX المتغيرات واحد فقط جعل غير النهائية في بناء محددة.لذلك طلب واحد فقط يمكن أن تمر عملية الإنشاء من دون خطأ.هل هناك طريقة أفضل لتحقيق هذا ؟ واسمحوا لي أن نعرف في التعليقات.

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