Difference between revisions of "Colecções de Objectos/Registo de Gatos"

From Wiki**3

< Colecções de Objectos
(Código da Solução)
(Diagrama UML)
 
(4 intermediate revisions by the same user not shown)
Line 7: Line 7:
  
 
{{CollapsedCode|Diagrama UML|
 
{{CollapsedCode|Diagrama UML|
[[image:catregistry-uml.png]]
+
[[image:uml-cat-registry.png|500px]]
 
}}
 
}}
  
Line 15: Line 15:
 
<source lang="java">
 
<source lang="java">
 
class DuplicateCatException extends Exception {
 
class DuplicateCatException extends Exception {
     public DuplicateCatException(String message) {
+
     public DuplicateCatException(String message) { super(message); }
        super(message);
 
    }
 
 
}
 
}
 
</source>
 
</source>
Line 25: Line 23:
 
<source lang="java">
 
<source lang="java">
 
class NoSuchCatException extends Exception {
 
class NoSuchCatException extends Exception {
     public NoSuchCatException(String message) {
+
     public NoSuchCatException(String message) { super(message); }
        super(message);
 
    }
 
 
}
 
}
 
</source>
 
</source>
Line 38: Line 34:
  
 
public class CatRegistry {
 
public class CatRegistry {
     private Map<String, Cat> cats;
+
     private Map<String, Cat> cats = new HashMap<>();
 
 
    public CatRegistry() {
 
        this.cats = new HashMap<>();
 
    }
 
  
 
     public void put(Cat cat) throws DuplicateCatException {
 
     public void put(Cat cat) throws DuplicateCatException {
Line 64: Line 56:
  
 
A classe '''Cat''' (não pedida no exercício) poderia ser algo como se apresenta de seguida.
 
A classe '''Cat''' (não pedida no exercício) poderia ser algo como se apresenta de seguida.
{{CollapsedCode|Classe CatRegistry|
+
{{CollapsedCode|Classe Cat|
 
<source lang="java">
 
<source lang="java">
 
class Cat {
 
class Cat {

Latest revision as of 14:27, 3 October 2024

Problema

Modele em UML (incluindo construtores) e implemente em Java uma classe CatRegistry cujas instâncias registam gatos (classe Cat). A classe CatRegistry deve manter um mapa de gatos, indexando-os pelos respectivos nomes. Não é necessário implementar a classe 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.

A interface da classe CatRegistry contém os métodos de inserção (put) e consulta (get). O primeiro (put) aceita um gato e regista-o (se o nome do gato já tiver sido usado – por um gato com esse nome já existir no mapa – deve lançar a excepção DuplicateCatException); o segundo (get) aceita o nome de um gato e devolve o gato com esse nome a partir do mapa, caso exista, ou lança uma excepção (NoSuchCatException), se não existir.

Diagrama UML

Diagrama UML

Uml-cat-registry.png

Código da Solução

Classe DuplicateCatException
class DuplicateCatException extends Exception {
    public DuplicateCatException(String message) { super(message); }
}
Classe NoSuchCatException
class NoSuchCatException extends Exception {
    public NoSuchCatException(String message) { super(message); }
}
Classe CatRegistry
import java.util.HashMap;
import java.util.Map;

public class CatRegistry {
    private Map<String, Cat> cats = new HashMap<>();

    public void put(Cat cat) throws DuplicateCatException {
        String name = cat.getName();
        if (cats.containsKey(name)) {
            throw new DuplicateCatException("A cat with the name " + name + " already exists.");
        }
        cats.put(name, cat);
    }

    public Cat get(String name) throws NoSuchCatException {
        Cat cat = cats.get(name);
        if (cat == null) {
            throw new NoSuchCatException("No cat found with the name " + name + ".");
        }
        return cat;
    }
}

A classe Cat (não pedida no exercício) poderia ser algo como se apresenta de seguida.

Classe Cat
class Cat {
    private String name;
    private int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}