2015-06-10 2 views
4

У меня есть два разных классов позволяет сказать:INJECT данные из одного типа объекта к другому

public class Customer { 
    public String Name; 
    public String Surname; 
} 

И

public class CustomerExtended { 
    public String Name; 
    public String Surname; 
    public int number; 
} 

Теперь позволяет сказать, что есть множество клиентов, и я хочу, чтобы ввести его в массив CustomerExtended. Таким образом, данные имени и фамилии будут переданы. Я знаю, что могу сделать это так:

for (int i; i<CustomerArray.length; i++) 
{ 
    CustomerExtended temp = new CustomerExtended(); 
    temp.Name = CustomerArray[i].Name; 
    temp.Surname = CustomerArray[i].Surname; 
    CustomerExtendedArray.add(temp); 
} 

Но то, что я прошу, если есть более простой способ, так как структура такая же, за исключением добавленного поля. Я знаю, что есть способ в C#, поэтому я должен быть в JAVA, я просто не могу его найти. :/Кто-нибудь знает дорогу и может показать мне пример?

Редактировать: Вышесказанное является просто быстрым примером. Почему мне это нужно, потому что у меня есть приложение для Android с классом, который я использую почти везде, и мне нужно сделать обновление для какого-то особого сценария. В этом сценарии я сначала должен заполнить список с локальными данными и дождаться данных из веб-службы, которая имеет тот же тип, но с двумя дополнительными полями. Из-за этого мне нужно расширить свой локальный тип и вставить в него текущие данные. Так что после того, как я смогу получить данные из webservice, типы будут соответствовать, и я могу просто обновить listview.

Вот почему я ищу самый быстрый и простой способ перемещения данных.

+1

Любая причина 'CustomerExtended' не ext end 'Customer'? – shmosel

+0

Можете ли вы использовать 'Java8' [потоки] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html) ??? Почему «android» помечен? –

+0

Дополнительная информация в моем редактировании. Надеюсь, что достаточно ясно, почему я пытаюсь ввести данные. –

ответ

1

Вы можете сделать это с помощью наследования:

public class Customer { 
    public String Name; 
    public String Surname; 
} 

public class CustomerExtended extends Customer { 
    public int number; 
} 

А затем создать и заполнить список клиентов

List<Customer> customerArray = new ArrayList<>(); 
Customer c = new Customer(); 
CustomerExtended d = new CustomerExtended(); 
customerArray.add(c); 
customerArray.add(d); 

Вы могли бы работать с этим списком:

for(Customer customer:customerArray){ 
    if(customer instanceof Customer){ 
     Customer e = (Customer)customer; 
     //Do your work here... 
    } 

    if(customer instanceof CustomerExtended){ 
     CustomerExtended f = (CustomerExtended)customer; 
     //Access number: 
     System.out.println(f.number); 
    } 
} 

Примечание что вы не должны позволять своему полю Name и Surname start wit h заглавную букву и быть публичной!

0

Я не знаю деталей вашего сценария. Но я вижу 2 варианта:

  1. CustomerExtended расширить класс Customer (унаследовать) и добавить только - http://www.javacoffeebreak.com/java104/java104.html И вы можете иметь также конструктор CustomerExtended, что получить в качестве параметра Заказчика. Также подумайте о том, чтобы защитить поля (не публичные) и получить для них геттеры и сеттеры
  2. Другой распространенный подход к случаям, когда они должны быть полностью разделены (что, по вашему мнению, не является вашим случаем), состоит в том, чтобы иметь утилита класс, чтобы преобразовать клиента в CustomerExtended

Kind Regards

PS Я также предлагаю вам проверить это - https://source.android.com/source/code-style.html

2

Вы можете использовать библиотеку Apache Commons BeanUtils. В классе BeanUtils есть следующий метод (цитата из https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html):

статической силы copyProperties (Dest Object, туринг Object)

Копирование значений свойств от происхождения бобов к фасоли назначения для всех случаев, когда имена свойств одинаковы.

Это работает с фасолью, поэтому вы должны добавить геттеры и сеттеры.

1

Вы можете это сделать, но для этого вам нужно добавить библиотеку Gson. Ваши два класса является следующим, в котором я добавить конструктор добавить несколько элементов:

public class Customer{ 
     public String Name; 
     public String Surname; 

     public Customer(String Name, String Surname){ 
      this.Name = Name; 
      this.Surname = Surname; 
     } 
    } 

    public class CustomerExtended{ 
     public String Name; 
     public String Surname; 
     public int number; 
    } 

Теперь вы можете преобразовать массив customer в customerExtended как выглядит следующим образом:

//Adding data to array: 
    Customer[] customers = new Customer[3]; 
      for(int i=0 ; i < customers.length ; i++){ 
       customers[i] = new Customer("Name"+i, "Surname"+i); 
      } 


//Here you can convert Customer object to CustomerExtended object 
    try{ 
     JsonElement jsonElement = new Gson().toJsonTree(customers); 
     CustomerExtended[] array = new Gson().fromJson(jsonElement, CustomerExtended[].class); 
     Log.d("test", array.toString()); 
     }catch(Exception e){ 
     e.printStackTrace(); 
     } 

Примечание: Это может быть сделано из AnyJson String в любой объект json, который может быть извлечен из webservice, содержит некоторые или все поля

+0

Это определенно выглядит многообещающим, поскольку нет необходимости создавать цикл и добавлять по одному элементу за раз. У вас есть информация о скорости и производительности этого подхода? –

+0

Ya вам не нужно использовать цикл и для скорости/производительности. Я использую Google-gson-библиотеку, поэтому, очевидно, производительность хорошая – Pankaj

Смежные вопросы