Sim, se você chamou myMethod()
10 vezes criará 10 objetos únicos e separados.
the new
keyword does exactly what it says on the tin, it creates a brand new object, indever of whether one already exists. Ele cria um novo objeto e stuffs a referência a esse objeto dentro da variável que foi dada, sobrepondo qualquer valor anterior (objeto) a variável mantida.
a variável myObject é redistribuída todas as vezes?
novamente, sim seria re-alocado com um novo objeto cada vez que o método foi chamado. Uma nota interessante sobre isso seria que a variável “realmente” não seria re-alocada como você está definindo a variável dentro do próprio corpo do método, de modo que cada vez que o método termina ele irá remover as variáveis que foram definidas dentro de seu’ escopo. Então o que ele realmente faz é criar 10 variáveis individuais e atribuir 10 objetos individuais, embora como eu disse que os outros deveriam ter sido removidos automaticamente para que ele não usasse qualquer memória adicional.
em poucas palavras: devo escrever um código assim só se planeio invocar esse método uma única vez?
Bem, como eu disse, no exemplo acima, cada objeto seria destruído no final de execução do método (supondo que você não atribua a referência de objeto a uma variável fora do escopo do método) assim, no seu exemplo, você poderia feliz, chamar o método de como muitas vezes como você queria, mas a cada vez que seria de forma a estar ligado para que as chamadas anteriores.
percebo que a minha forma de escrever pode ser confusa, por isso, se quiser que esclareça alguma coisa, basta pedir.
‘why not declare FileWriter, FileReader, BufferedReader and BufferedWriter at the top of the class as they did for the other variables?Está bem, presumo que compreendas que as variáveis não são chamadas FileWriter
, FileReader
, BufferedReader
, and BufferedWriter
, but rather this is the variable type. Os seus nomes são fw
, fr
, br
, e bw
. Se não percebes o que quero dizer, pergunta. A partir de Agora vou me referir às variáveis pelos nomes que você fez para tornar a leitura mais fácil, depois de tudo fw
apenas significa FileWriter
de qualquer forma, não deve haver muita confusão.
a chave para esta questão está escondida dentro dos nomes das próprias variáveis. Observe como eles terminam em Reader
ou Writer
isso pode nos dar uma pista sutil sobre seus usos. Claramente FileWriter
e BufferedWriter
devem fazer com a saída de alguma forma. Olhando para o código, vemos que as nossas suspeitas estavam certas e que em nenhum momento, a não ser no método writeText(JTextArea area)
, estas variáveis aparecem. Assim, se a variável não utilizada em qualquer outro lugar dentro do código de faria sentido lógico para definir e iniciar-las dentro do método em que são usados, não só tornar o código mais fácil de ler, porque nós, então, “conhecer” essas variáveis estão relacionadas apenas com esse método, mas também tem o benefício das variáveis, sendo removido ao final da execução do método, assim, não deixando de variáveis na existência que foram utilizados apenas muito brevemente. Por estas regras podemos dizer que o mesmo é verdade para FileReader
e BufferedReader
.
Observe este exemplo sobre escopo variável. (Veja os comentários que adicionei ao código)
public class DataBase {private static String buf, retString = "\n"; // buf & retString - createdprivate static File file = new File("test.txt"); // file - createdpublic static void readText(JTextArea area) { try { FileReader fr = new FileReader (file); // fr (FileReader) - created BufferedReader br = new BufferedReader(fr); // br (BufferedReader) - created while ((buf = br.readLine()) != null) { area.append(buf); area.append(retString); } br.close(); fr.close(); } // fr (FileReader & br (BufferedReader) - destroyed catch (IOException e) { System.out.println("Exception: " + e); }}public static void writeText(JTextArea area) { try { FileWriter fw = new FileWriter (file); // fw (FileWriter) - created BufferedWriter bw = new BufferedWriter(fw); // bw (BufferedWriter) - created bw.write(area.getText()); bw.close(); fw.close(); } // fw & bw - destroyed catch (IOException e) { System.out.println("Exception: " + e); }}} // buf, retString and file - Still exist as long as the object exists
a partir deste exemplo, torna-se mais claro por que as variáveis são definidas nos métodos e não como variáveis de instância e inicializadas dentro do construtor. Ele permite um código muito mais limpo, bem como ser mais readabe.
Why doing it every time the method is called rather than using maybe the same instance variable?
bem esta questão tem a ver com tipos variáveis. Não podíamos reutilizar uma única variável para todas as informações, pois os tipos teriam de ser diferentes.
Se nós tomamos todas as variáveis do código
private static String buf, retString = "\n"; // validprivate static File file = new File("test.txt"); // validFileReader fr = new FileReader (file); // validBufferedReader br = new BufferedReader(fr); // validFileWriter fw = new FileWriter (file); // validBufferedWriter bw = new BufferedWriter(fw); // valid
Agora sabemos que não podemos colocar um valor que não é do mesmo tipo que a variável em que a variável para algo como
FileReader fr = new BufferedReader(fr); // Is not valid!
Porque os tipos de simplesmente não correspondem.Faz sentido?