名前のマッピング
Java では、パッケージを使用して名前空間を非公式に定義します。Objective C++ には C++ 名前空間がありますが、Objective C にはありません。複数のパッケージのクラスを使用するときに名前の一意性を維持するため、J2ObjC は型名にラクダ付きバージョンのパッケージを先頭に追加します。たとえば、java.util.Map
は JavaUtilMap
に変更されます。
残念ながら、パッケージ名の長いキャメルケースでは、生成されたコードの可読性が低下する可能性があります。たとえば、Google Guava のベータ版アノテーションは、com.google.common.annotations
パッケージに含まれています。ComGoogleCommonAnnotationsBeta
は、Beta
よりも読みにくくなっています。
パッケージ接頭辞の定義
Objective-C で非公式の名前空間を定義する慣例では、共有接頭辞(通常は 2 文字の大文字)を使用します。iOS Foundation Framework では、NeXTStep の「NS」などが使用されます。Google Guava のベータ版の名前を簡素化するため、「GG」などの接頭辞を使用すると、Beta
が GGBeta
として参照され、読みやすくなります。
J2ObjC は、パッケージ名にマップするために独自のプレフィックスを指定するデベロッパーをサポートしています。この操作は、コマンドラインで --prefix package=prefix
を使用して行います。Beta
のパッケージ内のクラス名をすべて短縮するには、「--prefix com.google.common.annotations=GG
」を使用します。パッケージごとに別々の接頭辞宣言が必要です。
複数のパッケージに単一の接頭辞を定義する
小さなライブラリには競合しない Java クラス名が含まれることが多いため、ワイルドカード パッケージの仕様で単一の接頭辞を共有できます。たとえば、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>
実行時に接頭辞を付けるクラス
完成したアプリにはプレフィックス付きのクラスがあるため、デフォルトでは元の Java クラス名を使用して配置することはできません。ただし、アプリのリソース バンドルに translates.properties という名前のファイルがあり、翻訳に使用される接頭辞がある場合、Class.forName(javaName)
はマッピングされたクラスを検出します。
Xcode で上記の Prefixes.properties を iOS アプリに追加するには、ビルド ターゲットの [Build Phases] タブを開き、[Copy Bundle Resources] セクションを開き、そのリストに Prefixes.properties ファイルを追加します。Java リソースのコンセプトと iOS リソースのマッピングについては、Java リソースをご覧ください。