2016-04-14 19 views
0

Bir sınıf bir örnek değişkeni olarak bir nesne içeriyorsa ve yapıcılardan biri parametre ile aynı türde bir nesneyi içeriyorsa, örnek değişkeni argümanını atamak veya yeni bir nesne oluşturmak için en iyi yöntemdir. argüman ve örnek değişkene YENİ HEDEF atayın. Ben seçenek A yazdınız ama this.center dolaylı modifiye edilebilir varolan nesneyi başvurulan bu hatalı bir davranış oluşturmak düşünüyordu BaşlangıçtaOluşturucuda Nesne Parametreleri: Yeni Örnek Oluşturma veya İşaretçi Atama?

public class MyCircle { 

    private MyPoint center; //contains variables int x and int y 
    private int radius; 

    //Non-controversial Constructor: 
    public MyCircle(int x, int y, int radius) { 
    //creates new center using a valid MyPoint constructor 
    this.center = new MyPoint(x, y); 
    this.radius = radius; 
    } 

    //OPTION A 
    public MyCircle(MyPoint center, int radius) { 
    this.center = center; 
    this.radius = radius; 
    } 

    //OPTION B 
    public MyCircle(MyPoint center, int radius){ 
    this.center = new MyPoint(center.getX(), center.getY()); 
    this.radius = radius; 
    } 
} 

: Burada

konuda çalışıyorum bir egzersizden bir örnek istemeden. Bunu düşünmenin alternatif yolu sanırım, bu, bir merkez paylaşan birden çok nesne oluşturmak için bir yol yaratması ve tek bir merkezin taşınması, o merkezin paylaştığı tüm çevreleri kasıtlı olarak hareket ettirmesidir. Java bu seçeneği atılacak (en azından geliştiricileri için) hiçbir işaretçileri vardır ve bu Şimdi gitmek için bir yol .. olmadığından

+0

Burada en iyi uygulama yok çünkü çağrı kodunun merkezde değişiklik yapmasını isteyebilirsiniz. Yoksa yapmazsın. Ayrıca, '' MyPoint'''ün değişmez olduğundan emin olun, böylece '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' values ​​values ​​values ​​values ​​copy copy cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot need need need need need need need need need need need need need need need need need need need need need need need need need need need need need need need need need need need yapıcı. – f1sh

cevap

0

:

public MyCircle(MyPoint center, int radius) { 
    this.center = center; 
    this.radius = radius; } 

daha iyi bence mu, sadece can Merkeze atayın ve MyPoint sınıfının riskli bir kopyasını almanıza gerek yok ... Riskli diyorum çünkü bunu yapmak istiyorsanız, en azından bu parametrenin sıfır olmayan durumunu kontrol etmelisiniz ....

Kesin bir şekilde düşünebilirsiniz ... ya merkez A seçeneğinde boşsa, haklısınız, bu olabilir, o zaman ya yasadışı bir atma atabilirsin. ameterexception veya sadece bu nesneyi varsayılan bir değere atama. ..

Ama benim görüşüm ..

+0

Teşekkürler. "İşaretçi" nin böyle bir terim olduğunu bilmiyordum. Soru gerçekten, "... yeni bir nesne oluştur veya mevcut bir nesneye referans ata" mı olmalıydı? Ayrıca, MyPoint'in veya bazı benzer nesnelerin boş olabileceği uyarısını da takdir ediyorum. –

0

Ben programınıza bağlı olduğunu düşünüyorum önce dediğim gibi. Çemberin MyPoint nesnesine bir başvurusu olmasını istiyorsanız, iletmeniz gerekir. Aksi halde, neden aslında x ve y değerlerinin içinden geçemezsiniz. Örneğin

, B seçeneği olarak yazılabilir: Değiştirmek istediğiniz zaman

public MyCircle(int x, int y, int radius) { 
    // rest 
} 
0

her iki seçenek de iyidir, ama dediğim gibi, bir nesne zamanla değişebilir, A seçeneği tamam Aynı anda birden fazla nesneyi ortalayın, örneğin bir Daire Listesi'nde, fakat benzersiz ve bağımsız merkez noktalara sahip olmak istiyorsanız, B seçeneği doğrudur. Öyleyse neden siz de hem yapıcınız var, hem de uygulamanızda birçok duruma bağlı olarak bir ya da bir tane kullanmıyorsanız, daha iyi düşünmeyi istediğiniz her şeyi kullanın, ikisini birden saklayın, bu benim tavsiyemdir.

Size yardımcı olur umarım.