型
- プリミティブ型の場合、J2ObjC は JNI 型 typedef を定義しています。
- 一般的なクラス型の場合、パッケージはクラス名の前にキャメルケースで付加されます。
- 生成されたパッケージ接頭辞を変更するには、パッケージ接頭辞をご覧ください。
- ベース オブジェクト タイプとすべてのタイプの変数に「id」を使用します。
- いくつかのコア Java 型は基盤型にマッピングされています。(例: String to NSString) です。
- 「volatile」と宣言されているフィールドの場合、J2ObjC には C11 _Atomic(...) 型を使用する typedef が多くなっています。
- 内部型の場合、内部クラス名は外部名にアンダースコア付きで追加されます。
Java の型 | Objective-C タイプ | Objective-C 揮発性タイプ |
---|---|---|
boolean | ブール値 | volatile_jboolean |
char | jchar | volatile_jchar |
byte | GiB | volatile_jbyte |
short | Jshort | volatile_jshort |
int | Jint | volatile_jint |
long | JLONG | volatile_jlong |
float | jfloat | volatile_jfloat |
倍精度 | jdouble | volatile_jdouble |
java.lang.Object | id | volatile_id |
型変数 | id | volatile_id |
java.lang.String | NSString* | volatile_id |
java.lang.Number | NSNumber* | volatile_id |
java.lang.Cloneable | NSCopy* | volatile_id |
foo.bar.Mumble | FooBarMumble* | volatile_id |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | volatile_id |
Methods
Objective-C のメソッドは Java メソッドと 2 つの重要な違いがあります。これらは構文的に異なり、メソッド セレクタのコンポーネント間にパラメータが埋め込まれます。Objective-C メソッドは、Java とは異なり、オーバーロードをサポートしていません。これらの違いは、生成されたセレクタにパラメータ型を埋め込むことで解決されます。これは、過負荷の Java メソッド間の名前の競合を防ぐために必要です。
生成される API メソッドには、インスタンス メソッド、静的メソッド、コンストラクタの 3 種類の Java メソッドがあります。インスタンス メソッドは、Objective-C インスタンス メソッドに変換されます。静的メソッドとコンストラクタを C スタイルの関数に変換しますが、Objective-C ラッパーを追加して、Objective-C デベロッパーに使い慣れた API を提供します。
インスタンス メソッド
メソッド名は次のように生成されます。
- ゼロ パラメータ メソッドに変更はありません
- 1 つ以上のパラメータは次のパターンを使用します。
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- パラメータ キーワードのルール:
- プリミティブ型の場合、キーワードは Java プリミティブの大文字の名前になります。(例: 「文字」)
- 非プリミティブ型の場合、キーワードはキャメルケースの完全修飾型名です。(例: 「ComGoogleFoo」)
- 配列型の場合、要素型のキーワードに「配列」が追加されます。
Java の例
interface Foo {
void bar();
String bar(int i);
java.util.List bar(String s, long[] l);
}
Objective-C の例
- (void)bar;
- (NSString *)barWithInt:(jint)i;
- (id<JavaUtilList>)barWithNSString:(NSString *)s
withLongArray:(IOSLongArray *)l;
静的メソッド
Objective-C クラスのメソッドは、インスタンス メソッドと同じ命名規則に従って追加されます。
C スタイルの関数は、次の命名規則を使用して追加されます。
- 生成された Objective-C セレクタから始めます。(例:
barWithInt:
) - コロンはアンダースコアに置き換えます。(例:
barWithInt_
) - クラス名の前にアンダースコアを付けます。(例:
ComGoogleFoo_barWithInt_
)
Java の例
package com.google;
class Foo {
static boolean bar() { ... }
static double bar(int[] i) { ... }
static void bar(String s, boolean b) { ... }
}
Objective-C の例
@interface Foo : NSObject
+ (jboolean)bar;
+ (jdouble)barWithIntArray:(IOSIntArray *)i;
+ (void)barWithNSString:(NSString *)s
withBoolean:(jboolean)b;
@end
FOUNDATION_EXPORT jboolean ComGoogleFoo_bar();
FOUNDATION_EXPORT jdouble ComGoogleFoo_barWithIntArray_(IOSIntArray *i);
FOUNDATION_EXPORT void ComGoogleFoo_barWithNSString_withBoolean_(NSString *s, jboolean b);
コンストラクタ
Objective-C の規則に従い、init
インスタンス メソッドが追加されています。コンストラクタにパラメータがある場合は、インスタンス メソッドと同じ命名規則が使用されます。
3 つの C スタイル関数が追加されました。
- 最初の関数は、新しく割り当てられたオブジェクトを最初のパラメータとして受け入れます。この関数は通常、サブクラス コンストラクタからの呼び出しに使用されます。これは、静的メソッドと同じ命名規則に従います。(init はメソッド名)
- 新しいオブジェクトを割り当てて初期化する関数が 2 つ追加されています。次の接頭辞で区別されます。
create_
関数は、自動解放されたオブジェクトを返します。new_
関数は、保持されているオブジェクトを返します。
Java の例
package com.google;
class Foo {
Foo() { ... }
Foo(Object a, Object b) { ... }
}
Objective-C の例
@interface ComGoogleFoo : NSObject
- (instancetype)init;
- (instancetype)initWithId:(id)a
withId:(id)b;
@end
FOUNDATION_EXPORT void ComGoogleFoo_init(ComGoogleFoo *self);
FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_init() NS_RETURNS_RETAINED;
FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_init();
FOUNDATION_EXPORT void ComGoogleFoo_initWithId_withId_(ComGoogleFoo *self, id a, id b);
FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_initWithId_withId_(id a, id b) NS_RETURNS_RETAINED;
FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_initWithId_withId_(id a, id b);
フィールド
インスタンス フィールド(非静的)
Java インスタンス変数は、Objective-C インスタンス変数になります。名前はアンダースコアの後に続きます。「final」と宣言されたプリミティブ フィールドは特殊なケースであり、インスタンス変数に変換されません。
- フィールドにアクセスするには「->」構文を使用します。
- プリミティブ フィールドは直接設定できます。
- 最終プリミティブ(定数)は静的定数に翻訳されます。(静的フィールドを参照)
- 非プリミティブ フィールドは、提供されているセッター関数を使用して設定する必要があります。
ClassName_set_fieldName_(instance, value)
Java の例
package com.google;
class Foo {
public int myInt;
public String myString;
}
Objective-C の例
Foo *foo = [[Foo alloc] init];
// Access a primitive field.
i = foo->myInt_;
// Set a primitive field.
foo->myInt_ = 5;
// Access a non-primitive field.
NSString *s = foo->myString_;
// Set a non-primitive field.
ComGoogleFoo_set_myString_(foo, @"bar");
静的フィールド
静的変数には、用意されているゲッター関数とセッター関数を使用してアクセスする必要があります。これらのアクセサ関数は、変数にアクセスする前にクラスの初期化が行われるようにします。
- 静的フィールドにアクセスする
ClassName_get_fieldName()
- (最終ではない)静的フィールドを割り当てます。
ClassName_set_fieldName()
- プリミティブ静的フィールドへのポインタを取得します。
ClassName_getRef_fieldName()
- 非最終フィールドと不揮発性フィールドでのみ使用できます。
最終的なプリミティブ フィールド(定数)は、クラスの初期化に依存しないため、直接安全にアクセスできます。
ClassName_fieldName
Java の例
package com.google;
class Foo {
public static final MY_FINAL_INT = 5;
public static int myInt;
public static String myString;
}
Objective-C の例
// Access a primitive constant field.
jint i = ComGoogleFoo_MY_FINAL_INT; // No class initialization
i = ComGoogleFoo_get_MY_FINAL_INT(); // Class initialization
// Access a primitive field.
i = ComGoogleFoo_get_myInt();
// Set a primitive field.
ComGoogleFoo_set_myInt(5);
// Access a non-primitive field.
NSString *s = ComGoogleFoo_get_myString();
// Set a non-primitive field.
ComGoogleFoo_set_myString(@"bar");
列挙型
J2ObjC は、Java 列挙型ごとに 2 つの型を生成します。Java 列挙型の全機能を提供する Objective-C クラス型が生成されます。さらに、C 列挙型は、基盤フレームワークの NS_ENUM マクロを使用して生成されます。Objective-C クラスタイプは、生成されたすべての API で使用されます。C 列挙型は、switch ステートメントの定数値やストレージ型として便利です。
生成される列挙型の名前は次のとおりです。
- Objective-C クラスには、通常の Java クラスと同じルールを使用して名前が付けられています。(タイプを参照)。
- C 列挙型は通常の Java クラスとして命名され、接尾辞「_Enum」が付加されます。
列挙型定数には、静的フィールドと同じようにアクセスします。
Java の例
package com.google;
enum Color {
RED, GREEN, BLUE
}
Objective-C ヘッダーの例
typedef NS_ENUM(NSUInteger, ComGoogleColor_Enum) {
ComGoogleColor_Enum_RED = 0;
ComGoogleColor_Enum_GREEN = 1;
ComGoogleColor_Enum_BLUE = 2;
};
@interface ComGoogleColor : JavaLangEnum < NSCopying >
+ (IOSObjectArray *)values;
+ (ComGoogleColor *)valueOfWithNSString:(NSString *)name;
@end
inline ComGoogleColor *ComGoogleColor_get_RED();
inline ComGoogleColor *ComGoogleColor_get_GREEN();
inline ComGoogleColor *ComGoogleColor_get_BLUE();
// Provides conversion from ComGoogleColor_Enum values.
FOUNDATION_EXPORT ComGoogleColor *ComGoogleColor_fromOrdinal(NSUInteger ordinal);