2012-06-25 15 views
7

olması için:bildirme değişken en biz aşağıdaki kod bloğunu var diyelim belirli tip

if (thing instanceof ObjectType) { 
    ((ObjectType)thing).operation1(); 
    ((ObjectType)thing).operation2(); 
    ((ObjectType)thing).operation3(); 
} 

Tüm tiplemeleri kodu çirkin görünmesini sağlar, bu blok içindeki objectType olarak 'şey' ilan bir yolu yoktur kodun Ben

OjectType differentThing = (ObjectType)thing; 

yapmak ve o andan itibaren 'differentThing' ile işe yarayabilir biliyorum, ama bu koda bazı karışıklıklara getiriyor. Bu soru geçmişte istendi eminim

if (thing instanceof ObjectType) { 
    (ObjectType)thing; //this would declare 'thing' to be an instance of ObjectType 
    thing.operation1(); 
    thing.operation2(); 
    thing.operation3(); 
} 

gibi muhtemelen bir şey bunu yapmanın güzel bir yolu var mı, ben gerçi bulamadım. Bana olası kopyaya işaret etmekten çekinmeyin.

+1

Bahsettiğiniz yoldan başka bir yol olduğunu düşünmüyorum. – nhahtdh

cevap

9

Hayır, bir değişken bildirildikten sonra, bu değişkenin türü çözülür. Eğer kafa karıştırıcı olduğunu düşündüğünüz

ObjectType differentThing = (ObjectType)thing; 

yaklaşımı: I (potansiyel olarak geçici olarak) bir değişkenin türünü değiştirmek yerine kadar daha karışıklığı sağlayacağına inanıyor. Bu yaklaşım yaygın olarak kullanılır ve deyimseldir - elbette gerekli olan yerlerde. (Bu, genellikle bir kod koku bir parçasıdır.)

Diğer bir seçenek bir yöntem elde etmektir: bir değişken bildirildi sonra

if (thing instanceof ObjectType) { 
    performOperations((ObjectType) thing); 
} 
... 

private void performOperations(ObjectType thing) { 
    thing.operation1(); 
    thing.operation2(); 
    thing.operation3(); 
} 
4

, değiştiremez tip. Sizin differentThing yaklaşım doğru biridir:

if (thing instanceof ObjectType) { 
    OjectType differentThing = (ObjectType)thing; 
    differentThing.operation1(); 
    differentThing.operation2(); 
    differentThing.operation3(); 
} 

Ben de kafa karıştırıcı demezdim: sürece differentThing değişkenin kapsamı if operatörün vücuda sınırlı olduğu gibi, bu okuyuculara açıktır ne oluyor.

2

Maalesef, bu mümkün değil. Bunun nedeni, bu kapsamdaki "şey" in her zaman aynı nesne tipinde olması ve bir kod bloğu içinde yeniden yapılamamasıdır.

İki değişken ada sahip olmaktan hoşlanmıyorsanız (şey gibi ve castedThing), her zaman başka bir işlev yaratabilirsiniz;

if (thing instanceof ObjectType) { 
    processObjectType((ObjectType)thing); 
} 
.. 

private void processObjectType(ObjectType thing) { 
    thing.operation1(); 
    thing.operation2(); 
    thing.operation3(); 
} 
İlgili konular