(→Solução: código Java) |
|||
Line 12: | Line 12: | ||
A classe gato, descrita no enunciado, pode ser a seguinte (note-se que deve implementar '''java.io.Serializable'''): | A classe gato, descrita no enunciado, pode ser a seguinte (note-se que deve implementar '''java.io.Serializable'''): | ||
+ | {{CollapsedCode|Cat.java| | ||
<source lang="java"> | <source lang="java"> | ||
import java.io.Serializable; | import java.io.Serializable; | ||
Line 26: | Line 27: | ||
} | } | ||
</source> | </source> | ||
+ | }} | ||
A classe do registo, '''CatRegistry''', é simplesmente um gestor de um mapa de gatos (também deve ser serializável): | A classe do registo, '''CatRegistry''', é simplesmente um gestor de um mapa de gatos (também deve ser serializável): | ||
+ | {{CollapsedCode|CatRegistry.java| | ||
<source lang="java"> | <source lang="java"> | ||
import java.util.Map; | import java.util.Map; | ||
Line 40: | Line 43: | ||
} | } | ||
</source> | </source> | ||
+ | }} | ||
Finalmente, a classe '''App''' é simplesmente a classe que contém a função '''main'''. Os comentários nessa função seguem os passos descritos no enunciado. | Finalmente, a classe '''App''' é simplesmente a classe que contém a função '''main'''. Os comentários nessa função seguem os passos descritos no enunciado. | ||
− | + | {{CollapsedCode|App.java (versão clássica)| | |
<source lang="java"> | <source lang="java"> | ||
import java.io.ObjectOutputStream; | import java.io.ObjectOutputStream; | ||
Line 61: | Line 65: | ||
Cat c2 = new Cat("Tareco", 1); | Cat c2 = new Cat("Tareco", 1); | ||
// (2) insere os gatos no registo | // (2) insere os gatos no registo | ||
− | registry. | + | registry. Put(c1); |
− | registry. | + | registry. Put(c2); |
try { | try { | ||
Line 89: | Line 93: | ||
} | } | ||
</source> | </source> | ||
+ | }} | ||
+ | |||
+ | {{CollapsedCode|App.java (versão com AutoCloseables) | | ||
+ | <source lang="java"> | ||
+ | import java.io.ObjectOutputStream; | ||
+ | import java.io.BufferedOutputStream; | ||
+ | import java.io.FileOutputStream; | ||
+ | |||
+ | import java.io.ObjectInputStream; | ||
+ | import java.io.BufferedInputStream; | ||
+ | import java.io.FileInputStream; | ||
+ | |||
+ | import java.io.IOException; | ||
+ | |||
+ | public class App { | ||
+ | public static void main(String[] args) { | ||
+ | // (1) cria um registo e dois gatos | ||
+ | CatRegistry registry = new CatRegistry(); | ||
+ | Cat c1 = new Cat("Pantufa", 9); | ||
+ | Cat c2 = new Cat("Tareco", 1); | ||
+ | // (2) insere os gatos no registo | ||
+ | registry. Put(c1); | ||
+ | registry. Put(c2); | ||
+ | |||
+ | try (ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")))) { | ||
+ | // (3) guarda o registo em disco | ||
+ | oos.writeObject(registry); | ||
+ | } | ||
+ | catch (IOException e) { e.printStackTrace(); } | ||
+ | |||
+ | try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cats.dat")))) { | ||
+ | // (4) recupera o registo a partir do disco | ||
+ | CatRegistry previousRegistry = (CatRegistry)ois.readObject(); | ||
+ | // (5) recupera os dois gatos a partir do registo | ||
+ | Cat recCat1 = previousRegistry.get("Pantufa"); | ||
+ | Cat recCat2 = previousRegistry.get("Tareco"); | ||
+ | // (6) apresenta os gatos na saída (System.out) | ||
+ | System.out.println(recCat1); | ||
+ | System.out.println(recCat2); | ||
+ | } | ||
+ | catch (IOException e) { e.printStackTrace(); } | ||
+ | catch (ClassNotFoundException e) { e.printStackTrace(); } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | }} | ||
== Compilação e Execução == | == Compilação e Execução == |
Modele e implemente uma classe CatRegistry cujas instâncias registam gatos. A classe deve manter um mapa de gatos, indexando-os pelos respectivos nomes. Não é necessário implementar Cat. Considere que a classe Cat tem atributos idade (_age) e nome (_name). Considere ainda que o construtor de Cat aceita os valores para os atributos mencionados e que os métodos de acesso (getters e setters) estão definidos. Considere ainda que Cat implementa a interface Serializable.
A interface da classe CatRegistry contém os métodos de inserção (put) e consulta (get). O primeiro aceita um gato e regista-o; o segundo aceita o nome de um gato e devolve o gato, caso exista, ou null, se não existir. Deve ser possível guardar em disco as instâncias do registo.
Escreva uma função main que execute as seguintes operações: (1) cria um registo e dois gatos; (2) insere os gatos no registo; (3) guarda o registo em disco; (4) recupera o registo a partir do disco; (5) recupera os dois gatos a partir do registo; e (6) apresenta os gatos na saída (System.out).
A classe gato, descrita no enunciado, pode ser a seguinte (note-se que deve implementar java.io.Serializable):
Cat.java |
---|
import java.io.Serializable;
public class Cat implements Serializable {
private String _name = "";
private int _age = 0;
public Cat(String name, int age) { _name = name; _age = age; }
public String getName() { return _name; }
public String toString() { return "CAT: " + _name + " " + _age; }
}
|
A classe do registo, CatRegistry, é simplesmente um gestor de um mapa de gatos (também deve ser serializável):
CatRegistry.java |
---|
import java.util.Map;
import java.util.TreeMap;
import java.io.Serializable;
public class CatRegistry implements Serializable {
private Map<String, Cat> _registry = new TreeMap<String, Cat>();
public Cat get(String name) { return _registry.get(name); }
public void put(Cat cat) { _registry.put(cat.getName(), cat); }
}
|
Finalmente, a classe App é simplesmente a classe que contém a função main. Os comentários nessa função seguem os passos descritos no enunciado.
App.java (versão clássica) |
---|
import java.io.ObjectOutputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class App {
public static void main(String[] args) {
// (1) cria um registo e dois gatos
CatRegistry registry = new CatRegistry();
Cat c1 = new Cat("Pantufa", 9);
Cat c2 = new Cat("Tareco", 1);
// (2) insere os gatos no registo
registry. Put(c1);
registry. Put(c2);
try {
// (3) guarda o registo em disco
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")));
oos.writeObject(registry);
oos.close();
}
catch (IOException e) { e.printStackTrace(); }
try {
// (4) recupera o registo a partir do disco
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cats.dat")));
CatRegistry previousRegistry = (CatRegistry)ois.readObject();
ois.close();
// (5) recupera os dois gatos a partir do registo
Cat recCat1 = previousRegistry.get("Pantufa");
Cat recCat2 = previousRegistry.get("Tareco");
// (6) apresenta os gatos na saída (System.out)
System.out.println(recCat1);
System.out.println(recCat2);
}
catch (IOException e) { e.printStackTrace(); }
catch (ClassNotFoundException e) { e.printStackTrace(); }
}
}
|
App.java (versão com AutoCloseables) |
---|
import java.io.ObjectOutputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class App {
public static void main(String[] args) {
// (1) cria um registo e dois gatos
CatRegistry registry = new CatRegistry();
Cat c1 = new Cat("Pantufa", 9);
Cat c2 = new Cat("Tareco", 1);
// (2) insere os gatos no registo
registry. Put(c1);
registry. Put(c2);
try (ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")))) {
// (3) guarda o registo em disco
oos.writeObject(registry);
}
catch (IOException e) { e.printStackTrace(); }
try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cats.dat")))) {
// (4) recupera o registo a partir do disco
CatRegistry previousRegistry = (CatRegistry)ois.readObject();
// (5) recupera os dois gatos a partir do registo
Cat recCat1 = previousRegistry.get("Pantufa");
Cat recCat2 = previousRegistry.get("Tareco");
// (6) apresenta os gatos na saída (System.out)
System.out.println(recCat1);
System.out.println(recCat2);
}
catch (IOException e) { e.printStackTrace(); }
catch (ClassNotFoundException e) { e.printStackTrace(); }
}
}
|
A compilação é o processo habitual:
javac App.java Cat.java CatRegistry.java
A execução do programa é como se segue:
java App
Resultado da execução:
CAT: Pantufa 9 CAT: Tareco 1