Çeviri Referansı

Türler

  • J2ObjC, temel türler için JNI tarzı typedef'leri tanımlamıştır.
  • Tipik sınıf türleri için paket büyük/küçük harf düzenine sahiptir ve sınıf adının başına eklenir.
    • Oluşturulan paket önekini yeniden adlandırmak için Paket Ön Ekleri bölümüne bakın.
  • Temel Nesne türü ve tüm tür değişkenleri için "id" kullanılır.
  • Bazı temel Java türleri, temel türleriyle eşlenir. (ör. Dizeden NSString'e)
  • "Değişken" olarak tanımlanan alanlarda J2ObjC, C11 _Atomic(...) türlerini kullanan daha fazla türe sahiptir.
  • Dahili türler için iç sınıf adı dış ada alt çizgiyle eklenir.
Java türü Hedef C-tür Hedef C- değişken değişken türü
boolean Jboo değişken_jboole
karakter Jchar değişken_jchar
bayt jbayt volatile_jbayt
kısa video kısa dalgalı_jshort
int ipucu volatile_jint
uzun Jlong değişken_jlong
kayan noktalı dalgalı değişken_hava
double Jdouble değişken_jdouble
java.lang.Nesne id değişken_kimlik
değişkenleri yazın id değişken_kimlik
java.lang.Dize NSString* değişken_kimlik
java.lang.Numarası NSNumber* değişken_kimlik
java.lang.Cloneable NSCopy* değişken_kimlik
foo.bar.Toplu Futbol Futbolu* değişken_kimlik
foo.bar.Kahraman%C4%B1 FooBarKarma_İç* değişken_kimlik

Yöntemler

Object-C yöntemleri, Java yöntemlerinden iki önemli açıdan ayrılır. Sözdizimsellik açısından farklıdırlar. Parametreler, yöntem seçicinin bileşenleri arasına yerleştirilir. Objective-C yöntemleri, Java'da olduğu gibi aşırı yüklemeyi desteklemez. Bu farklılıklar, parametre türleri oluşturulan seçiciye yerleştirilerek çözülür. Bu, aşırı yüklü Java yöntemleri arasında ad çakışmalarını önlemek için gereklidir.

Oluşturulan API'de farklılık gösteren üç tür Java yöntemi vardır: örnek yöntemleri, statik yöntemler ve kurucular. Örnek yöntemleri, Objective-C örnek yöntemlerine dönüştürülür. Statik yöntemler ve kurucular C stili işlevlere dönüşür ancak Objective-C geliştiricilerine daha tanıdık bir API sağlamak için Objective-C sarmalayıcıları da ekler.

Örnek Yöntemleri

Yöntem adları şu şekilde oluşturulur:

  • Sıfır parametre yönteminde değişiklik yapılmaz
  • Bir veya daha fazla parametrede aşağıdaki kalıp kullanılıyor:
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • Parametre anahtar kelime kuralları:
    • Temel türler için anahtar kelime, Java temel kelimesinin büyük adıdır. (ör. "Char")
    • Temel olmayan türlerde anahtar kelime, deveyle büyük tam nitelikli tür adıdır. (ör. "ComGoogleFoo")
    • Dizi türlerinde, öğe türünün anahtar kelimesine "Dizi" eklenir.
Örnek Java
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
Örnek Hedef C
- (void)bar;

- (NSString *)barWithInt:(jint)i;

- (id<JavaUtilList>)barWithNSString:(NSString *)s
                      withLongArray:(IOSLongArray *)l;

Statik Yöntemler

Örnek yöntemleriyle aynı adlandırma kurallarına göre Objective-C sınıf yöntemi eklenir.

C adlandırma işlevi aşağıdaki adlandırma kuralları kullanılarak eklenir:

  • Oluşturulan Objective-C seçici ile başlayın. (ör. barWithInt:)
  • İki nokta üst üste işaretlerini alt çizgiyle değiştirin. (ör. barWithInt_)
  • Sınıf adının başına, alt çizgiyle ayrılmış bir ad ekleyin. (ör. ComGoogleFoo_barWithInt_)
Örnek Java
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
Örnek Hedef 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);

Markalar

Objective-C kuralından sonra, bir init örnek yöntemi eklenir. Oluşturucuda parametreler varsa örnek yöntemleriyle aynı adlandırma kuralı kullanılır.

Üç C stili işlevi eklendi:

  • İlk işlev, ilk parametre olarak yeni tahsis edilen nesneyi kabul eder. Bu işlev genellikle alt sınıf kurucusundan çağrı yapmak için kullanılır. Bu, statik yöntemlerle aynı adlandırma kurallarına uyar. (burada "başlama" yöntemi adıdır)
  • Yeni nesneyi dağıtacak ve başlatacak iki işlev eklenir. Ön ekleri ile ayırt edilirler:
    • create_ işlevi, otomatik olarak yayınlanan bir nesneyi döndürür.
    • new_ işlevi, saklanan nesneyi döndürür.
Örnek Java
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
Örnek Hedef 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);

Alanlar

Örnek Alanları (statik olmayan)

Java örneği değişkenleri, Objective-C örnek değişkenleri olur. Adın sonunda ve sonunda alt çizgi bulunur. "Son" olarak belirtilen temel alanlar özel bir destek kaydıdur ve örnek değişkenlerine çevrilmez.

  • Alanlara doğrudan "->" söz dizimi kullanılarak erişilebilir.
  • Temel alanlar doğrudan ayarlanabilir.
    • Son temel öğeler (sabit değerler) statik sabitler gibi çevrilir. (Statik Alanlar bölümüne bakın)
  • Temel olmayan alanlar, sağlanan seter işlevi kullanılarak ayarlanmalıdır:
    • ClassName_set_fieldName_(instance, value)
Örnek Java
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
Örnek Hedef 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");

Statik Alanlar

Statik değişkenlere, getter ve setter işlevleri kullanılarak erişilmelidir. Bu erişimci işlevleri, değişkene erişmeden önce sınıf başlatma işleminin gerçekleşmesini sağlar.

  • Statik bir alana erişme
    • ClassName_get_fieldName()
  • (Nihai olmayan) statik bir alan atayın
    • ClassName_set_fieldName()
  • Temel bir statik alana işaretçi alma
    • ClassName_getRef_fieldName()
    • Yalnızca nihai ve kalıcı olmayan alanlar için kullanılabilir.

Değerleri sınıfın ilkine göre belirlenmediğinden, nihai temel alanlara (sabit değerler) doğrudan erişim güvenlidir.

  • ClassName_fieldName
Örnek Java
package com.google;
class Foo {
  public static final MY_FINAL_INT = 5;
  public static int myInt;
  public static String myString;
}
Örnek Hedef 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");

Sıralamalar

J2ObjC, her Java sıralama işlemi için iki tür oluşturur. Java enum'un tüm işlevlerini sağlayan Objective-C sınıf türü oluşturulur. Ayrıca, temel çerçevenin NS_ENUM makrosu kullanılarak bir enum oluşturulur. Objective-C sınıf türü, oluşturulan tüm API'ler tarafından kullanılır. C enum, bir anahtar ifadesi için sabit değer veya depolama türü olarak yararlıdır.

Oluşturulan sıralama türleri aşağıdaki şekilde adlandırılır:

  • Objective-C sınıfı, normal Java sınıfıyla aynı kural kullanılarak adlandırılır. (Türler bölümünü inceleyin)
  • C enum, eklenen "_Enum" son ekiyle normal bir Java sınıfı olarak adlandırılır.

Sıralama sabitlerine statik alanlar gibi erişilir.

Örnek Java
package com.google;
enum Color {
  RED, GREEN, BLUE
}
Örnek Objective-C Üstbilgisi
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);