Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

nym-ph

Aceder a diferentes tipos de Objectos dentro de um ArrayList

Recommended Posts

nym-ph

Boas Noites pessoal!

Estou aqui com uma dificuldade num trabalho para a cadeira de programação, será que poderiam dar-me um empurrãozinho pff?

Tenho uma classe Station, e respectivas sub classes,

Station

StationMetro

StationMetroExterna

StationBus

StationTrain

Carreguei dentro de um ArralyList stationsList, todas as estações de um dado ficheiro...

Agora preciso de aceder ao ArrayList,

Se fizer,

StationsList.get(i).getStationName();

retorna o stationName, pois está definido na Classe Station. A classe mãe!

Mas se em i, tiver um objecto to tipo StationTrain, e tentar aceder ao método getCost(), que é especifico desta Classe

stationsList.get(i).getCost();

Ele dá-me Cannot be resolved to a field...

Entretanto lembrei-me que posso fazer um ArrayList, com ArrayLists lá dentro... o que talvez conseguisse resolver o problema, pois cada ArrayList poderia ter um tipo de objecto... Mas aumentava-me imenso a complexidade para depois fazer o que pretendo...

Já tentei isto também,

(StationTrain)stationsList.get(i).getCost();

mas sem sucesso...

Alguém sabe como posso aceder aos objectos que lá tenho dentro? Tinha a ideia que poderia guardar dentro de um ArrayList qualquer tipo de objectos que pretendesse...

Obrigado pessoal!

Share this post


Link to post
Share on other sites
Baderous

Tendo um ArrayList<Station>, podes lá colocar qualquer objecto que seja do tipo Station ou qualquer sub-tipo deste (subclasse, portanto). No entanto, para invocares métodos sobre esses objectos, apenas aqueles que são comuns a todas as classes dessa hierarquia podem ser invocados da forma normal (como verificaste). Se, no entanto, quiseres invocar um método que seja específico de uma dada subclasse, terás de testar qual o tipo do objecto sobre o qual estás a invocar o método, para garantir que é um tipo (uma classe) que implementa esse método. Tens também de converter o objecto em questão para o tipo específico:

Station s = stationList.get(i);
if (s.getClass().getSimpleName().equals("StationTrain")) {
    s = (StationTrain)s;
    s.getCost();
}

 

Share this post


Link to post
Share on other sites
shumy

é mais adequado usar o instanceof.


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Share this post


Link to post
Share on other sites
Knitter

Se queres aceder a métodos específicos de cada sub-classe, que não existem nem fazem sentido existir na super-classe (porque se fizerem sentido então deviam lá estar ;) ), porque não usar listas diferentes?

Usar apenas uma lista para guardar todos os objectos que partilham uma mesma hierarquia é uma boa opção quando não queres fazer deles nada além do que a classe comum oferece, se queres fazer coisas diferentes apenas com alguns deles então cria uma lista apenas para esse caso. Com isto evitas comparações desnecessárias e, pelo menos com a informação que deste, simplificas o código.

Usar o operador instanceof não é mais adequado. É um operador a evitar e é um operador que raramente é necessário usar, a maioria dos casos onde o sugerem são situações onde se pode facilmente simplificar o código e evitar um operador bastante dispendioso.

Share this post


Link to post
Share on other sites
shumy

Não estava a presumir o objectivo do código, se podes evitar instanceof porreiro. Apenas é melhor opção que:  s.getClass().getSimpleName().equals("StationTrain")


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Share this post


Link to post
Share on other sites
shumy

Nem era por ai. Era simplesmente pelo facto de estares a comparar strings, o que não me parece melhor que um instanceof. Para não falar que esse método pode falhar redondamente, tem em conta que o getSimpleName() não te garante um valor único.


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Share this post


Link to post
Share on other sites
Baderous

Isso do valor único tem a ver com a cena do ClassLoader? Porque é que dizes que a comparação de strings é pior?

Share this post


Link to post
Share on other sites
shumy

Valor único tem a ver com o facto poderes ter duas classes com o mesmo nome em packages diferentes, já que o getSimpleName() descarta os packages.

Comparação de tipos é menos propicia a erros humanos (como já reparaste) e é tecnicamente mais rápido. Nem é que a diferença seja notável, mas se o java fornece uma ferramenta apropriada para fazer estas comparações, então para que inventar?


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.