Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Objeto sem referencia dentro de outro objeto sem referência

Bom dia a todos Quando o professor colocou um objeto sem referência dentro da criação de outro objeto, me veio uma ideia, era possivel fazer mais de uma vez dentro de um objeto?

 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("lorem3.txt")));

E o código funcionou. E fazendo isso mais de uma vez

        BufferedReader buf = new BufferedReader(new InputStreamReader(fis));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("lorem3.txt")));

A dúvida que eu fiquei foi, dá para colocar objetos sem referência dentro do outro à vontade, ou isso não é recomendável. Código completo do arquivo:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class TesteEscreverArquivo {
    public static void main(String[] args) throws IOException {
        InputStream fis = System.in;
        BufferedReader buf = new BufferedReader(new InputStreamReader(fis));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("lorem3.txt")));
        String linha = buf.readLine();
        while(linha != null && !linha.isEmpty()){
            bw.write(linha);
            bw.newLine();
            linha = buf.readLine();
        }
        buf.close();
        bw.close();
    }
}
1 resposta
solução!

Olá Murilo, tudo bem com você?

Normalmente, guardamos um objeto em uma variável de referência quando precisamos nos referenciar direto a ele, utilizando métodos diretamente a partir dele. Por exemplo, se dentro do código

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("lorem3.txt")));

Nós quisessemos nos referenciar diretamente ao OutputStreamWriter, seria conveniente guardar esse objeto dentro de uma variável. No entanto, esse objeto está sendo utilizado dentro da classe BufferedWriter, que é quem vai fazer a manipulação do OutputStreamWriter. Assim, não precisamos guardar esse objeto dentro de uma referência.

Ainda assim, é importante lembrar que não estamos atribuindo esses objetos a variáveis de referência, no entanto, essas referências existem dentro da classe que as usam, como assim?

Como foi dito acima, a classe BufferedWriter vai receber um OutputStreamWriter que, por sua vez, vai receber um FileOutputStream. Isso acontece porque internamente o OutputStreamWriter precisa do FileOutputStream e de seus métodos para funcionar, e analogamente o BufferedWriter precisa do OutputStreamWriter. Em suma, estamos fazendo composição de objetos e é correto imaginar que dentro da classe OutputStreamWriter existe um atributo de referência a um objeto FileOutputStream e na classe BufferedWriter existe um atributo de referência OutputStreamWriter, para garantir o funcionamento dos seus métodos. Ou seja, essas referências estão sendo guardadas por composição, dentro de abstrações de nível mais alto, para garantir mais funcionalidades, reaproveitando as funcionalidades e comportamentos das abstrações de nível mais baixo.

Enfim, é bastante comum passar construtores dentro de outros construtores e isso normalmente ocorre quando não precisamos acessar diretamente uma variável de referência a um objeto. No entanto, isso normalmente ocorre quando queremos fazer uma composição de objetos e, nesse caso, essa referência estará sendo guardada no objeto mais externo.

Espero que tenha ficado claro, fico à disposição em caso de dúvidas!

Um grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!