Эффективный способ перебора дочерних элементов DataSnapshot

#android #firebase #garbage-collection #firebase-realtime-database

#Android #firebase #сбор мусора #firebase-база данных в реальном времени

Вопрос:

Какой из этих двух фрагментов кода более эффективен или они оба одинаковые?

предположим, что база данных выглядит следующим образом:

 root
- userUID
-- messageUID
---- text:""
---- sentTo:""
-- messageUID2 {...}
-- messageUID3 {...}
-- messageUID4 {...}
  

тогда первое, что я попробовал, было это

 DatabaseReference ref = FirebaseDatabase.getInstance().child(userId).addListenerForSingleValueEvent(new ValueEventListener(){

    @Override
    public void onDataChange(DataSnapshot dataSnapshot){
      //..
      ArrayList<Message> messageList = new ArrayList<>();
      for(DataSnapshot messageSnapshot: dataSnapshot.getChildren()){
        Message message = messageSnapshot.getValue(Message.class);
        messageList.add(message);
      }
      //..
    }

    @Override
    public void onCancelled(DatabaseError databaseError){
      //..
    }

});
  

но потом я заметил, что буду создавать много объектов сообщений. Будет ли это более эффективно?

 DatabaseReference ref = FirebaseDatabase.getInstance().child(userId).addListenerForSingleValueEvent(new ValueEventListener(){

    @Override
    public void onDataChange(DataSnapshot dataSnapshot){
      //..
      ArrayList<Message> messageList = new ArrayList<>();
        Message message = new Message("","");
        for(DataSnapshot messageSnapshot: dataSnapshot.getChildren()){
          message.setText(messageSnapshot.getValue("text");
          message.setSentTo(messageSnapshot.getValue("sentTo");
          messageList.add(message);
        }
      //..
    }

    @Override
    public void onCancelled(DatabaseError databaseError){
      //..
    }

});
  

Комментарии:

1. Мне это кажется преждевременной микрооптимизацией. Большинство современных виртуальных машин в любом случае оптимизируют Message этот узкий цикл.