نقشه برداری نام
جاوا از بسته ها برای تعریف غیررسمی فضاهای نام استفاده می کند. در حالی که 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 دارد.