型
- プリミティブ型の場合、J2ObjC には JNI スタイルの typedef が定義されています。
- 一般的なクラスタイプでは、パッケージはキャメルケース形式になり、クラス名の前に付加されます。
- 生成されたパッケージ接頭辞の名前を変更するには、パッケージ接頭辞をご覧ください。
- 基本のオブジェクト型とすべての型変数の場合、「id」は使用されます。
- いくつかのコア Java 型は、基盤型にマッピングされています。(例: 文字列を NSString に変換)
- 「volatile」と宣言されたフィールドの場合、J2ObjC には、C11 の _Atomic(...) 型を使用する typedef がさらにあります。
- 内部型の場合、内部クラス名は外部の名前にアンダースコア付きで付加されます。
Java の型 | Objective-C タイプ | Objective-C の揮発性タイプ |
---|---|---|
ブール値 | jboolean | volatile_jboolean |
char | jchar | volatile_jchar |
バイト | jbyte | volatile_jbyte |
short | jshort | volatile_jshort |
int | ジント | volatile_jint |
long | jlong | volatile_jlong |
float | jfloat | volatile_jfloat |
double | 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 | NSCopying* | volatile_id |
foo.bar.Mumble | FooBarMumble* | volatile_id |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | volatile_id |
メソッド
Objective-C のメソッドと Java のメソッドには、2 つの重要な違いがあります。構文的には、 メソッド セレクタのコンポーネント間にパラメータを埋め込みます。Objective-C メソッドは Java とは異なりオーバーロードをサポートしていません。これらの違いは、 生成されたセレクタにパラメータ型を格納します。これは、名前の競合を防ぐために必要です。 あります。
Java メソッドには、生成される API が異なる 3 種類(インスタンス メソッド、静的メソッド) メソッド、コンストラクタがあります。インスタンス メソッドは Objective-C のインスタンス メソッドに変換されます。静的 メソッドとコンストラクタを C スタイルの関数に変換し、さらに Objective-C ラッパーを追加して は、Objective-C デベロッパーにより使いやすい API を提供します。
インスタンス メソッド
メソッド名は次のように生成されます。
- ゼロ パラメータのメソッドに変更はありません。
- 1 つ以上のパラメータで次のパターンが使用されています。
<ph type="x-smartling-placeholder">
- </ph>
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- パラメータ キーワードのルール:
<ph type="x-smartling-placeholder">
- </ph>
- プリミティブ型の場合、キーワードは Java プリミティブの大文字化された名前です。(例: "Char")
- 非プリミティブ型の場合、キーワードはキャメルケースで囲まれた完全修飾型名になります。(例: 「ComGoogleFoo」)
- 配列型の場合: 「Array」要素タイプのキーワードに追加されます。
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 スタイルの関数が追加されています。
- 1 つ目の関数は、新しく割り当てられたオブジェクトを 1 つ目のパラメータとして受け取ります。この関数は、 通常はサブクラス コンストラクタからの呼び出しに使用します。静的変数の場合と同じ命名規則に従い、 あります。(「init」はメソッド名です)。
- 新しいオブジェクトを割り当てて初期化する 2 つの関数が追加されます。違いは、
使用します。
<ph type="x-smartling-placeholder">
- </ph>
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」と宣言されている特殊なケースであり、インスタンスには変換されません。 使用します。
- フィールドには「->」を使用して直接アクセスできます。説明します。
- プリミティブ フィールドは直接設定できます。
- 最終的なプリミティブ(定数)は静的定数のように変換されます。(静的フィールドを参照)。
- 非プリミティブ フィールドは、用意されているセッター関数を使用して設定する必要があります。
<ph type="x-smartling-placeholder">
- </ph>
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");
静的フィールド
静的変数には、提供されているゲッター関数とセッター関数を使用してアクセスする必要があります。 これらのアクセサ関数は、変数へのアクセス前にクラスの初期化が行われていることを確認します。
- 静的フィールドにアクセスする
<ph type="x-smartling-placeholder">
- </ph>
ClassName_get_fieldName()
- (非最終)静的フィールドを割り当てる
<ph type="x-smartling-placeholder">
- </ph>
ClassName_set_fieldName()
- プリミティブ静的フィールドへのポインタを取得する
<ph type="x-smartling-placeholder">
- </ph>
ClassName_getRef_fieldName()
- 非 final フィールドと不揮発性フィールドでのみ使用できます。
最終プリミティブ フィールド(定数)の値は、クラスの初期化に依存しないため、直接安全にアクセスできます。
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 つの型を生成します。Objective-C クラスタイプが生成されます。 Java 列挙型のすべての機能が提供されます。さらに、Foundation を使用して 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);