翻訳リファレンス

  • プリミティブ型の場合、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);