2013-08-09 13 views
8

bir yöntem birden nesne türlerini döndürmek için en iyi yolu, ama en iyi yolu ne olduğundan emin değilim yap. ? extends myObject'u kullanarak baktığımda, hem dönmek istediğim nesneleri hem de List<Object>'u kullanarak başka bir sınıf oluşturdum.Java - i 2 farklı nesneler oluşturmak ve ben bu nesnelerin her iki dönmek istediğiniz yere ben bir yöntemi var benim DAO

Bu benzer nesnelere neden ihtiyaç duyulduğumun kısa bir açıklaması, ekranda 1 görüntülenmesi ve diğerinin de farkında olduğum kadarıyla bir nesnenin listelerini işlemeyen primefaces dataexporter ile kullanılmasıdır.

Sınıf Kişi

public class Person() { 
    firstName = null; 
    lastName = null; 
    List<Programs> programs = new ArrayList<Programs>(); 

    // Getters and setters 
} 

Sınıf DataExporterPerson

public class DataExporterPerson() { 
    firstName = null; 
    lastName = null; 
    String program = null; 

    // Getters and setters 
} 

DAO yöntemi:

public List<SOMETHING> getPeople() { 
    // query db for people 

    // build both objects 

    return ????? 
} 

Şimdi ben çok kolay aşağıdaki gibi başka bir nesne oluşturabilirsiniz anlıyorum, ama görünüyor Bir şeyleri yapmak için verimsiz bir yol gibi, çünkü temelde 1 metreden dönmek için bir nesne oluşturuyorum od.

public class PersonTransporter() { 
    Person person = null; 
    DataExporterPerson = null; 
} 

Bu senaryoyu ele almanın en iyi yolu nedir? Bu veri tabanında sorgulama yapıp verilere dayalı 2 nesneler oluşturur bir DAO yöntemi olmadığından

DÜZENLEME

i 1 yönteminde 2 nesneleri döndürmek çalışıyorum nedenidir. Bunu 2 yönteme ayırmak istemiyorum çünkü ihtiyacım yoksa iki kez db'yi sorgulamak istemiyorum.

+1

Neden "DataExporterPerson" Kişiyi 'genişletmiyor? Sonra bir Koleksiyon 'kullanabilirsiniz. –

+1

İki şey yapmak için tek bir yöntem için genellikle kötü bir fikirdir. Bir yöntemin neden * iki dönüş değeri gerektirdiğini açıklayabilir misiniz? –

+0

İki şey yapmıyor olabilir; Bir şey yapabilir ve 2-tuple yapabilir. –

cevap

8

Sen miras, veya muhafazası ile bu işleyebilir ya.

Person ve DataExporterPerson, AbstractPerson gibi bir şeyleri genişletebilirsiniz. Ancak, daha önce yapmadığınız için, muhtemelen miras almak uygun değildir.

Ben kapsama miras daha iyidir nasıl anlattı Etkili C++ olduğunu düşünüyorum. IIRC'nin belirtilen sebebi, kaplamanın kalıtımdan daha gevşek bir şekilde eşleştirilmesidir.

Burada Person ve DataExporterPerson hem içeren bir nesne olurdu. Sizin yönteminiz, bu sendika tipi nesne için olanlardan birini doldurur ve hangisinin boş olduğunu görerek hangisinin gerçekte olduğunu bilirsiniz.

public class DBPersonUnion { 
    private Person person = null; 
    private DataExporterPerson dataExporterPerson = null; 

    //getters and setters. 
} 
+0

Birkaç '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'seçeneklerinden bir ya da iki yardımcı metodu veya bir' 'sendika' 'türü için numaralandırma yapın. Bu etkili bir Cebirsel Veri Türüdür. –

+0

'' Perso'n ve 'DataExporterPerso'' AbstractPerson'u genişletmeme rağmen, bu bana nasıl yardımcı olur, çünkü yine de hem “Person” hem de “DataExporterPerson” ı DAO yöntemimden geri göndermem gerekiyordu. – Catfish

-2

İki farklı şeyler yapabilirdi.

birinci yöntem imza public List<Object> getPeople() olması gerekir. Bu, instanceof yapmanıza ve hangisinin hangisinin olduğunu belirlemenize olanak tanır.

VEYA

Eğer DataExporterPerson (hem DataExporterPerson ve Person/uygular uzatmak ve bu türler olarak kullanmak, yeni bir sınıf/arayüzünü veya yapmak) Person uzatmak olabilir.

5

Sizin yönteminizin iki farklı tür döndürmesi gerekiyorsa, bu, mimariniz veya yöntem mantığınız ile ilgili yanlış bir şey olduğuna dair bir ipucudur.

Ne yapabilirsin?

  • iki yöntemleri nesne ile yumruk dönüş, ikinci kullanım parametre uygulamak ve ikinci nesnesi geri
  • hem sınıf uygulayacak, ortak bir arayüz tanıtmak
    • mantıksal elemanları katılacak bir sınıf oluşturma

      , .

    class Foo { 
        String f; 
    } 
    
    class Bar { 
        String b; 
    } 
    

    son noktayı

    için örnek Öyleyse sorun ne nesne Foo ve Bar dönmek için?

    public Object theProblemMethod() { 
    
         Foo a = new Foo(); 
          a.foo = "Test"; 
    
         Bar b = new Bar(); 
          b.bar = a.foo; //The logic where class Foo meet class Bar. 
    
        return ??? 
    
    } 
    

    geçerli uygulama

    public Foo createFoo(){ 
         Foo a = new Foo(); 
          a.foo = "Test"; 
         return a; 
        } 
    
        public Bar createBar(Foo f) { 
    
         Bar b = new Bar(); 
          b.bar = f.foo; 
         reutrn b; 
        } 
    

    Kullanımı

    public void action() { 
    
          //theProblemMethod(); //This we can not do 
    
          Foo a = createFoo(); 
          Bar b = createBar(a); 
        } 
    
  • +0

    , lütfen III'rd noktanızı düzenleyebilir misiniz? Açık değildir. – Algorithmist

    +0

    @Algorithmist, Umarım şimdi temizlerim. –

    2

    Gerçek mesele burada tasarım biridir. Hiçbir yöntem birden fazla şey yapmamalıdır: bu nedenle iki farklı nesne döndüren bir yöntem muhtemelen kötü bir tasarımdır. Bu sorunu gerçekten çözmek için, yönteminizi iki farklı sorunu ele almak için iki, ayrı yöntemlere ayırmalısınız. Bununla birlikte, bunu yapamayacağınızı varsayalım. Notlarınıza dayanarak, iki nesnedeki durumunuzun çoğunun tekrarlandığı görülür. Bu ikisini, benzer bir kaynaktan miras almalarını sağlayarak birleştirebilirsiniz - ancak bu sadece probleminizin yarısını çözmektedir. Bunun yerine, birbirleri ile tek dekore edebilirsiniz: kesinlikle iki nesneleri döndüren gerekiyorsa

    public class DataExporterPerson { 
        private Person person; 
        private String program = null; //or any other 
    
        //other getters/setters, esp to get the core 'person' object. 
        //note that getters/setters for repeated state should just 
        // pass through to the underlying object: 
        public String getName() { person.getName(); } //for example 
    } 
    

    , bunu, ama bu test etmek zor ve 'hayır yan etkisi' ilkesini ihlal:

    public boolean buildThings(ThingA a, ThingB b) { 
        a = <whatever>; 
        b = <whatever else>; 
    
        return true;//success! 
    } 
    
    //... 
    //somewhere else in code 
    ThingA a = null; 
    ThingB b = null; 
    boolean result = buildThings(a, b); 
    //use a and b here 
    
    +0

    İkinci örneğiniz çalışmıyor çünkü nesnelerim farklı bir sınıfta. Benim ThingA'm ve ThingB'im benim destek fasulyemde ve benim metodum DAO'mda. – Catfish

    +0

    Öyleyse, "Bir nesneyi iki yöntemden nasıl döndürürüm?"'. –

    +0

    Gerçekten değil. ClassB.methodA, classB.methodA adında bir çok nesne döndürmeye çalıştığım classA.methodA çağrısı var. – Catfish

    İlgili konular