نحوه تعیین پیشوند برای نام بسته ها.

نقشه برداری نام

جاوا از بسته ها برای تعریف غیررسمی فضاهای نام استفاده می کند. در حالی که Objective C++ دارای فضای نام C++ است، Objective C ندارد. برای حفظ منحصربه‌فرد بودن نام هنگام استفاده از کلاس‌ها از بسته‌های متعدد، J2ObjC یک نسخه شتری از بسته را به نام نوع اضافه می‌کند. به عنوان مثال، java.util.Map به JavaUtilMap تغییر نام داده است.

متأسفانه، نام بسته های شتر می تواند خوانایی کد تولید شده را کاهش دهد، به خصوص با نام بسته های طولانی. به عنوان مثال، حاشیه نویسی بتای Google Guava در بسته com.google.common.annotations قرار دارد و خواندن ComGoogleCommonAnnotationsBeta دشوارتر از Beta است.

تعریف پیشوند بسته

قرارداد Objective-C برای تعریف فضاهای نام غیررسمی استفاده از یک پیشوند مشترک، معمولاً دو حرف بزرگ است. به عنوان مثال، چارچوب بنیاد iOS از "NS" (از NeXTStep ) استفاده می کند. برای ساده کردن نام بتا Google Guava، پیشوندی مانند "GG" با ارجاع به Beta به عنوان GGBeta خوانایی را بهبود می بخشد.

J2ObjC از توسعه دهندگان پشتیبانی می کند تا پیشوندهای خود را برای نگاشت به نام بسته ها مشخص کنند. این کار در خط فرمان با استفاده از --prefix package = prefix انجام می شود. برای کوتاه کردن همه نام‌های کلاس در بسته Beta ، از " --prefix com.google.common.annotations=GG "" استفاده می‌شود. برای هر بسته یک پیشوند جداگانه لازم است.

تعریف یک پیشوند واحد برای بسته های چندگانه

کتابخانه‌های کوچک‌تر معمولاً دارای نام‌های کلاس جاوا هستند که تضاد ندارند، و بنابراین می‌توانند یک پیشوند واحد را با مشخصات بسته‌های wildcarded به اشتراک بگذارند. برای مثال، همه بسته‌های Joda-Time می‌توانند با استفاده از --prefix 'org.joda.time.*=JT' یک پیشوند JT را به اشتراک بگذارند. تنها کاراکتر عام پشتیبانی شده «*» است، که به همان شیوه پوسته خط فرمان با نام فایل ها مطابقت دارد.

تعریف پیشوندهای بسته چندگانه

برای ساده کردن تعریف چند پیشوند، می توان از یک فایل خواص با آرگومان " --prefixes file " استفاده کرد:

cat prefixes.properties
com.google.common.annotations: GG
com.google.common.base: GG

# While GG can be used for all packages, let's mix it up.
com.google.common.collect: GC
com.google.common.io: GIO        # A prefix can be more than two characters,
com.google.common.net: GuavaNet  # a lot more!
...
j2objc --prefixes prefixes.properties <args>

کلاس های پیشوند در زمان اجرا

از آنجایی که برنامه تمام‌شده دارای کلاس‌هایی با پیشوند است، نمی‌توان آن‌ها را با استفاده از نام کلاس اصلی جاوا به‌طور پیش‌فرض قرار داد. با این حال، اگر برنامه دارای فایلی به نام prefixes.properties در بسته منابع خود با پیشوندهای مورد استفاده برای ترجمه باشد، Class.forName(javaName) کلاس نگاشت شده را پیدا می کند.

برای افزودن prefixes.properties بالا به یک برنامه iOS در Xcode، برگه Build Fases هدف ساخت را باز کنید، بخش Copy Bundle Resources آن را گسترش دهید و فایل prefixes.properties را به آن لیست اضافه کنید. Java Resources اطلاعات بیشتری در مورد نحوه نگاشت مفاهیم منابع جاوا به منابع iOS دارد.