Buscar

Fechamento de Recursos

Prévia do material em texto

Quando	trabalhamos	com	recursos	que	falam	com	a	parte	externa	da	nossa	aplicação,	é	preciso	que
avisemos	quando	acabarmos	de	usar	esses	recursos.	Por	isso,	é	importantíssimo	lembrar	de	fechar
os	canais	com	o	exterior	os	quais	abrimos,	utilizando	o	método		close	!
3.	 Voltando	à	classe		ManipuladorDeContas	,	completemos	o	método		salvaDados		para	que	utilize	a
nossa	nova	classe		RepositorioDeContas		criada.
Resposta:
	public	void	salvaDados(Evento	evento){
					List<Conta>	contas	=	evento.getLista("listaContas");
					RepositorioDeContas	repositorio	=	new	RepositorioDeContas();
					repositorio.salva(contas);
	}
Rode	sua	aplicação,	cadastre	algumas	contas	e	veja	se	aparece	um	arquivo	chamado		contas.txt	
dentro	 do	 diretório	 	src		 de	 seu	 projeto.	 Talvez	 seja	 necessário	 dar	 F5	 nele	 para	 que	 o	 arquivo
apareça.
4.	 (Opcional	 e	 difícil)	 Façamos	 com	 que,	 além	 de	 salvar	 os	 dados	 em	 um	 arquivo,	 nossa	 aplicação
também	consiga	carregar	as	informações	das	contas	a	fim	de	exibi-las	na	tela.	Para	o	funcionamento
da	aplicação,	é	necessário	que	a	nossa	classe		ManipuladorDeContas		 tenha	um	método	 chamado
	carregaDados	,	 o	 qual	 devolva	 uma	 	List<Conta>	.	 Façamos	 o	 mesmo	 que	 anteriormente	 e
encapsulemos	a	lógica	de	carregamento	dentro	da	classe		RepositorioDeContas	:
	public	List<Conta>	carregaDados()	{
					RepositorioDeContas	repositorio	=	new	RepositorioDeContas();
					return	repositorio.carrega();
	}
Faça	 o	 código	 referente	 ao	 método	 	 carrega	 ,	 que	 devolve	 uma	 	 List	 	 dentro	 da	 classe
	RepositorioDeContas	,	utilizando	a	classe		Scanner	.	Para	obter	os	valores	de	cada	atributo,	você
pode	 utilizar	 o	 método	 	split	 	 da	 	String	 .	 Lembre-se	 de	 que	 os	 atributos	 das	 contas	 são
carregados	na	seguinte	ordem:		tipo	,		numero	,		agencia	,		titular		e		saldo	.	Exemplo:
					String	linha	=	scanner.nextLine();
					String[]	valores	=	linha.split(",");
					String	tipo	=	valores[0];
Além	disso,	a	conta	deve	ser	instanciada	de	acordo	com	o	conteúdo	do		tipo		obtido.	Fique	atento,
pois	os	dados	lidos	virão	sempre	lidos	em	forma	de		String		e,	para	alguns	atributos,	será	necessário
transformar	o	dado	nos	tipos	primitivos	correspondentes.	Por	exemplo:
							String	numeroTexto	=	valores[1];
							int	numero	=	Integer.parseInt(numeroTexto);
A	seguir	a	resposta	completa	para	esse	item:
	public	List<Conta>	carrega()	{
358	 23.21	EXERCÍCIOS	17.11:	APÊNDICE	JAVA	I/O
									List<Conta>	contas	=	new	ArrayList<>();
									try	(Scanner	scanner	=	new	Scanner(new	File("contas.txt")))	{
													while	(scanner.hasNextLine())	{
																	Conta	conta;
																	String	linha	=	scanner.nextLine();
																	String[]	valores	=	linha.split(",");
																	String	tipo	=	valores[0];
																	int	numero	=	Integer.parseInt(valores[1]);
																	String	agencia	=	valores[2];
																	String	titular	=	valores[3];
																	double	saldo	=	Double.parseDouble(valores[4]);
																	if	(tipo.equals("Conta	Corrente"))	{
																					conta	=	new	ContaCorrente(numero,	agencia,	titular,	saldo);
																	}	else	{
																					conta	=	new	ContaPoupanca(numero,	agencia,	titular,	saldo);
																	}
																	contas.add(conta);
													}
									}	catch	(FileNotFoundException	e)	{
													System.out.println("Não	tem	arquivo	ainda");
									}
									return	contas;
					}
5.	 (Opcional)	 A	 classe	 	Scanner	 	 é	 muito	 poderosa!	 Consulte	 seu	 Javadoc	 para	 saber	 sobre	 o
	delimiter		e	os	outros	métodos		next	.
6.	 (Opcional)	Crie	 uma	 classe		TestaInteger	,	 e	 façamos	 comparações	 com		Integer	s	 dentro	 do
	main	:
	Integer	x1	=	new	Integer(10);
	Integer	x2	=	new	Integer(10);
	if	(x1	==	x2)	{
					System.out.println("igual");
	}	else	{
					System.out.println("diferente");
	}
E	se	testarmos	com	o		equals	?	O	que	podemos	concluir?
Resposta:	A	conclusão	é	aquela	mesma	do	capítulo	de	orientação	a	objeto	do	curso.	Não	importa	se
todos	 as	 informações	 são	 exatamente	 iguais:	 quando	 usamos	 o	 	==	 ,	 estamos	 comparando	 as
variáveis,	isto	é,	a	referência	a	objetos.
Se	demos		new		 duas	 vezes,	 cada	 referência	 aponta	 para	 um	objeto	diferente,	 e,	 portanto	não	 são
iguais.	Já	o		equals		do		Integer	,	que	sobrescreve	o	do		Object	,	compara	o	conteúdo	dos	objetos.
7.	 (Opcional)	Um		double		não	está	sendo	suficiente	para	guardar	a	quantidade	de	casas	necessárias
em	uma	aplicação.	Preciso	guardar	um	número	decimal	muito	grande.	O	que	poderia	usar?
O		double		 também	 tem	problemas	de	precisão	ao	 fazer	contas	por	causa	de	arredondamentos	da
aritmética	de	ponto	flutuante	definido	pela	IEEE	754:
23.21	EXERCÍCIOS	17.11:	APÊNDICE	JAVA	I/O	 359

Continue navegando