Require that every instance has 2 attributes

3

Hello, I have a function class with attributes name, code and salary (all private), and a class Manager - which extends Employee - with the quantity attribute Employees, also private.

How can I force every manager instance to have FunFunction quantity and name, and what name is an attribute of the parent class?

    
asked by anonymous 07.06.2015 / 21:04

2 answers

1

Just create a single constructor in the Manager class with the 2 parameters, so you will not be able to instantiate Manager without parameters.

Example:

Official.java

public class Funcionario {
    private String nome;

    public Funcionario(String nome) {
        this.nome = nome;
    }    

    public void setNome(String nome) {
        this.nome = nome;
    }
}

Manager.java

public class Gerente extends Funcionario {
    private int quantidadeFuncionarios;

    public Gerente(String nome, int quantidadeFuncionarios) {
        super(nome); // construtor do funcionário
        if(nome == null || nome.isEmpty()){
            throw new IllegalArgumentException("Nome não pode ser vazio");
        }
        if(quantidadeFuncionarios < 0){
            throw new IllegalArgumentException("Quantidade funcionarios não opde ser inferior a zero");
        }
        this.quantidadeFuncionarios = quantidadeFuncionarios;
    }

    public int getQuantidadeFuncionarios() {
        return quantidadeFuncionarios;
    }

    public void setQuantidadeFuncionarios(int quantidadeFuncionarios) {
        this.quantidadeFuncionarios = quantidadeFuncionarios;
    }
}

I've incremented the code above with the validations made by Filipe Gonzaga Miranda .

Using
public static void main(String[] argv) {
    Gerente gerente = new Gerente("Ana", 3); /* sem parâmetros da erro */
    System.out.println(gerente.getNome() + " - " + gerente.getQuantidadeFuncionarios());
}

Output

  

Ana - 3

    
07.06.2015 / 21:14
4

@Ana, in addition to using the constructor, also validate the methods, so you create invariants for your class and impose rules for the states that your class can be. In other words, do not just create a manager with a number of Employees quantity It is important to ensure that this quantidaed is >= 0 (greater than or equal to zero) or even greater than zero.

Another important validation at the time of creation is making sure that the users in your class will not define a name nulo or empty ""

public Gerente(String nome, int quantidadeFuncionarios) {
        if(nome == null || nome.isEmpty()){
            throw new IllegaArgumentException("Nome não pode ser vazio");
        }
        if(quantidadeFuncionarios < 0){
            throw new IllegalArgumentException("Quantidade funcionarios não opde ser inferior a zero");
        }
        this.setNome(nome); // herdando do funcionário
        this.quantidadeFuncionarios = quantidadeFuncionarios;
    }

The best way to actually force your objects to be in a valid state is this.

Please call this exception: link

Consider making your objects immutable.

Another way to secure the invariants of your class is to redraw it to be immutable.

There are some trade offs to consider, check out this tutorial: link

    
07.06.2015 / 21:33