Records
Conceito Base
Records são classes imutáveis que atuam como portadores transparentes de dados, introduzidos no Java 16.
Sintaxe Básica
public record NetrunnerCredentials(
String handle,
byte[] biometricHash,
int clearanceLevel
) {}
// Uso
var creds = new NetrunnerCredentials("Phantom",
"bio123".getBytes(),
5);
System.out.println(creds.handle()); // Getter automático
System.out.println(creds.clearanceLevel()); // Getter automático
Características Principais
Imutabilidade
public record SecurityToken(
String id,
long timestamp,
Set<String> permissions
) {
// Construtor canônico validador
public SecurityToken {
// Cria cópia defensiva imutável
permissions = Set.copyOf(permissions);
}
}
Métodos Adicionais
public record DataPacket(
byte[] payload,
String destination,
int priority
) {
// Método instance
public boolean isHighPriority() {
return priority > 5;
}
// Método static
public static DataPacket createEmergency(String dest) {
return new DataPacket(new byte[0], dest, 10);
}
}
Casos de Uso
DTOs (Data Transfer Objects)
public record UserProfile(
String id,
String nickname,
int reputationScore,
LocalDateTime lastLogin
) {}
public record NetworkStatus(
boolean connected,
int latency,
List<String> activeNodes
) {}
Value Objects
public record IpAddress(String address) {
public IpAddress {
if (!isValid(address)) {
throw new IllegalArgumentException("Invalid IP");
}
}
private static boolean isValid(String addr) {
// Validação de IP
return addr.matches("^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$");
}
}
Interoperabilidade
Com Interfaces
public interface Traceable {
String getIdentifier();
}
public record TraceRoute(
String source,
String destination,
List<String> hops
) implements Traceable {
@Override
public String getIdentifier() {
return source + "->" + destination;
}
}
Com Pattern Matching
public void processData(Object data) {
if (data instanceof DataPacket(var payload, var dest, var priority)) {
System.out.printf("Packet to %s with priority %d%n",
dest, priority);
}
}
Boas Práticas
Uso Apropriado
Para dados imutáveis
Para transferência de dados
Para objetos de valor
Validação
No construtor canônico
Cópias defensivas
Invariantes de negócio
Limitações
Não podem estender classes
Sempre são final
Campos sempre são final
Exercícios Práticos
// 1. Crie um record para configurações
public record SystemConfig(
int maxConnections,
Duration timeout,
Set<String> allowedIPs
) {
// Adicione validações
}
// 2. Implemente um record para métricas
public record NetworkMetrics(
long bytesTransferred,
int activeConnections,
double throughput
) {
// Adicione métodos úteis
}
// 3. Desenvolva um record para eventos
public record SecurityEvent(
String eventId,
LocalDateTime timestamp,
String description,
SecurityLevel level
) {
// Implemente lógica adicional
}
Próximos Passos
26 June 2025