java

T.I.L.

IF em Java

O uso correto do IF em Java

Post original no LinkedIn. O conteúdo abaixo é um registro do que aprendi com o post. Nada aqui foi autoria minha.

O uso correto do If em Java

...e como evita-lo!

O if deve ser usado quando é necessário tomar decisões diretas e locais no código. No entanto, o uso excessivo pode indicar que a lógica não está bem estruturada.

✅ Para decisões simples e pontuais

if (idade >= 18) {
  System.out.println("Você pode dirigir!");
}

✅ Para validar entradas e lançar exceções

if (valor <= 0) {
  throw new IllegalArgumentException("O valor deve ser positivo!");
}

✅ Para fluxos simples dentro de loops

for (Produto produto : listaProdutos) {
  if (produto.getPreco() > 100) {
    System.out.println(produto.getNome() + " é caro!");
  }
}

Quando evitar o if

❌ Muitos if-else aninhados.
➡️ Prefira polimorfismo ou o padrão Strategy

❌ Controle de muitos estados
➡️ O padrão State é mais eficiente

❌ Escolha entre várias opções fixas
➡️ Use um Map ao invés de if-else gigante

Exemplo de substituição do if-else por um Map

Map<String, Runnable> operacoes = Map.of(
  "PIX", this::processaPix,
  "BOLETO", this::processaBoleto
);
 
operacoes.getOrDefault(tipo, () -> {
  throw new IllegalArgumentException("Tipo inválido");
}).run();

O if não é o vilão, mas se espalhar pelo código pode ser um sinal de alerta. Prefira abstrações inteligentes para evitar a complexidade desnecessária.

Validação no construtor Java

Mantendo a validação dos setters no construtor de uma classe Java

Uma boa prática na hora de criar os construtores de uma classe, é reaproveitar os setters dos atributos para manter a validação.

Imagine que temos a classe Carro, com seus respectivos setters:

public class Carro {
	private String marca;
	private String modelo;
	private int ano;
 
	public void setMarca(String marca) {
		this.marca = marca;
	}
 
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
 
	public void setAno(int ano) {
		if (ano > 0 && ano <= 2025) {
			this.ano = ano;
		}
	}
}

Perceba que temos uma validação no método setAno(int ano), que impede que o usuário defina um ano menor que 0 (negativo) e maior que 2025.

Agora vamos criar o construtor para a classe:

public class Carro {
	private String marca;
	private String modelo;
	private int ano;
 
	public Carro(String marca, String modelo, int ano) {
		this.marca = marca;
		this.modelo = modelo;
		this.ano = ano;
	}
 
	public void setMarca(String marca) {
		this.marca = marca;
	}
 
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
 
	public void setAno(int ano) {
		if (ano > 0 && ano <= 2025) {
			this.ano = ano;
		}
	}
}

Criando o construtor desse jeito, podemos instanciar a classe passando os seguintes parâmetros:

Carro carro = new Carro("Ferrari", "HB20", -2024);

Perceba que podemos passar o valor negativo como parâmetro do construtor, e isso é válido, já que o construtor não possui validação, apenas o setter do ano setAno(int ano).

Parra corrigir isso, é só chamarmos os setters no construtor, para manter a validação:

public class Carro {
	private String marca;
	private String modelo;
	private int ano;
 
	public Carro(String marca, String modelo, int ano) {
		setMarca(marca);
		setModelo(modelo);
		setAno(ano);
	}
 
	public void setMarca(String marca) {
		this.marca = marca;
	}
 
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
 
	public void setAno(int ano) {
		if (ano > 0 && ano <= 2025) {
			this.ano = ano;
		}
	}
}

Relearning Java

How we start a Java file

Java is a 100% POO language, so to starts a Java software, our main function need to be a class method.

The filename need to be the same of the class that was declared in this file.

So the basic structure of Java file is:

class Program {
  public static void main(String[] args) {
    System.out.println("Hello World");
  }
}

Where Program is the class name of this file and main the method name, i.e., the main function that will be executed.

  • public means that our main() method can be used by all files that imports Program
  • static means that our main() method can be called without instantiate the class Program
  • void means that our main() method doesn't return anything
  • args is the argument that our main() method receives. In this case, an array of String objects. This is the way that Java receives the arguments passed by the command line.
  • System.out.println() is the way that Java print something in the console.
    • System is a class that Java provides to us native methods to interact with the system
    • out is a static object of System class that represents the output stream
    • println() is a method of out object that prints a string and a new line (Alternative: print(), that prints only the string without a new line)

And, the filename need to be Program.java because our class is named Program.