Dúvida no código

pessoal, eu gostaria que vocês me tirassem uma dúvida a respeito desse codigo

public class RepositorioContas implements Serializable {
    private static RepositorioContas instance;
private ArrayList<Conta> contas;

private RepositorioContas() {
    this.contas = contas;
}
    
 private static RepositorioContas getInstance(){
     if(instance == null){
         instance = lerDoArquivo();
     }
     
     return instance;
 }
 
 private static RepositorioContas lerDoArquivo() {
	RepositorioContas instancia = null;
	File in = new File("contas.txt");
	FileInputStream fis = null;
	ObjectInputStream ois = null;
	try {
		fis = new FileInputStream(in);
		ois = new ObjectInputStream(fis);
		Object o = ois.readObject();
		instancia = (RepositorioContas) o;
	} catch (Exception e) {
		instancia = new RepositorioContas();
	} 
            return instancia;

}
public void salvarArquivo() {
if (instance == null) {
return;
}
File out = new File(“contas.txt”);
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(out);
oos = new ObjectOutputStream(fos);
oos.writeObject(instance);
} catch (Exception e) {
e.printStackTrace();
}
}
}

eu tenho uma dúvida a respeito do metodo getInstance(), se instance == null como vou ler algo que é null? sinceramente não consegui entender a logica dessa parte em específico

classe conta

public class Conta {
private String numero;
private double saldo;

public Conta(String numero, double saldo) {
    this.numero = numero;
    this.saldo = saldo;
}



public String getNumero() {
    return numero;
}

public void setNumero(String numero) {
    this.numero = numero;
}

public double getSaldo() {
    return saldo;
}

public void setSaldo(double saldo) {
    this.saldo = saldo;
}}
public void salvarArquivo(){
	if (instance == null){
		return;
	}
	
	File out = new File(“contas.txt”);
	FileOutputStream fos = null;
	ObjectOutputStream oos = null;
	
	try{
		fos = new FileOutputStream(out);
		oos = new ObjectOutputStream(fos);
		oos.writeObject(instance);
		
	}catch(Exception e){
		e.printStackTrace();
	}
}

Se instance == null, então o método salvarArquivo é finalizado (já que o return termina a execução qualquer método). Caso instance não seja igual a null, então o restante do bloco será executado.

1 curtida

então quer dizer que quando instance for == null o arquivo é salvo?

se sim, como isso pode acontecer? ja que é null? confesso que não entendo

seria porque no bloco catch do metodo lerDoArquivo ele instancia um objeto de repositorioContas? daí a instancia precisa ser == null,por conta do padrão singleton?

Achei que tivesse sido bem explícito. Mas vou melhorar a explicação:

Quando instance não for igual a null (instance != null), então executa:

File out = new File(“contas.txt”);
FileOutputStream fos = null;
ObjectOutputStream oos = null;

try{
	fos = new FileOutputStream(out);
	oos = new ObjectOutputStream(fos);
	oos.writeObject(instance);
}catch(Exception e){
	e.printStackTrace();
}

Daí as classes FileOutputStream, ObjectOutputStream e o método writeObject (da classe ObjectOutputStream) fazem o seu trabalho. Se ocorrer algum erro, uma exceção é lançada.
Caso seja igual a null (instance == null) o método é simplesmente finalizado (return é só usado para interromper a execução do método, já que a função é void, ou seja, não tem retorno). Isso significa que o controle do programa é devolvido ao objeto chamador (quem invocou o método salvarArquivo()) e a execução do programa continua normalmente.
Quanto ao método getInstance():

private static RepositorioContas getInstance(){
	if(instance == null){
		instance = lerDoArquivo();
	}
 
	return instance;
}

Há simplesmente uma verificação. Se nenhuma instancia foi criada, ou seja, instance == null, então a variável instance recebe dados retornados pelo método lerDoArquivo(), isto é, a variável instance é inicializada. Por fim, o método retorna a variável instance que é do tipo RepositorioContas.

Para mais detalhes sobre essas classes, por favor, consulte a documentação (Docs Oracle - Java SE 10).

1 curtida

agora sim entendi!! obrigado pela explicação.

na minha cabeça ele estava querendo ler uma instância de RepositorioContas que é igual a null.

agora ficou claro para mim