Dúvidas sobre VO

E aí galera beleza?

Estou tendo um conflito de conceitos a respeito de vo.
Sempre entendi que um vo, usando o struts, era na verdade um bean com tipos como int, string, etc, que eu colocava em um arraylist que percorria na página. Agora lendo o core j2ee paterns me deparei com o seguinte vo:

public class ContactVO implements java.io.Serializable { 

// public members
public String firstName; 
public String lastName; 
public String address;

// default constructor
public ContactVO() {}

// constructor accepting all values
public ContactVO(String firstName, 
String lastName, String address){
init(firstName, lastName, address);
}

// constructor to create a new VO based 
// using an existing VO instance
public ContactVO(ContactVO contact) { 
init (contact.firstName, 
contact.lastName, contact.address);
}

// method to set all the values
public void init(String firstName, 
String lastName, String address) { 
this.firstName = firstName; 
this.lastName = lastName; 
this.address = address;
} 

// create a new value object 
public ContactVO getData() { 
return new ContactVO(this);
} 

}

E aqui na empresa usa-se um abstract class como padrão pra todos os vos:

/*
 * EntidadeVO.java
 *
 * 
 */

package util;

import java.util.*;

/**
 * Esta classe á a classe mãe de todos os VO (Value Objects). Ela não pode ser
 * instanciada. Deve ser herdada por classes que  implementem apenas os Gets
 * apropriados e as conversões explícitas  necessárias.  P ex. :  public String
 * getNome() {  EntidadeNome en = (EntidadeNome) get(); return en.getNome(); }
 * @author abarra
 * @version 1.0
 * @updated 22-set-2004 09:56:42
 */
public abstract class EntidadeVO {
      
      ArrayList list = new ArrayList();
      int index = -1;

/*
 * Adiciona um objeto no ArrayList
 */
      public void add(Object obj) {
            list.add(obj);
      }
      
      
      
	public void remove() {
		   list.remove(this.index);
   }


      /*
       *retorna um objeto do ArrayList
       */
      
      public Object get() {
            return list.get(index);
      }
      
    
      /*
       * retorna o tamanho do ArrayList. Quantidade de objetos 
       * guardados
       */
      
      public int size() {
            return list.size();
      }
      
      /* 
       * retorna se existe um próximo objeto ou não
       */
      public boolean next() {
            boolean retorno;
            
            index++;
            
            if(index < list.size()) {
                  retorno = true;
            }else {
                  index = list.size() - 1;
                  retorno = false;
            }
            
            return retorno;
      }
      
      /*
       *retorna se existe um objeto anterior ou não
       */
      
      public boolean previous() {
            index--;
            
            boolean retorno;
            
            if(index < 0) {
                  index = 0;
                  retorno = false;
            }else {
                  retorno = true;
            }
            
            return retorno;
      }

      /* Seleciona um índice valido especifico
       *
       */
      public void setIndex(int index) {
            if (index > list.size() || index == list.size()) {
                  index = list.size() - 1;
            }
            if (index < 1) {
                  index = -1;
            }
            
            this.index = index;
      }
      
      /* retorna o indice atual 
       *
       */
      public int getIndex() {
            return this.index;
      }
}

Tipo não entendi nenhum destes dois. Os dois crian uma espécie de array, tipo o do core j2ee implementa um serializable e o da empresa coloca tudo em um arraylist. Mas não entendi em que ponto o vo do cre j2ee cria o serializable e nem quando se lê. Mas a pergunta verdadeira é: Qual o conceito certo? Meu conceito estava muito errado? Como faço pra usar o vo da sun?