1.4-Software-Development-Principles

Records in Java

Inleiding

Records zijn toegevoeg aan Java voor situaties waarin je een setje van gegevens wilt bewaren. Data is dan altijd final en kan niet verandered worden. Een record kan gemakkelijk geschreven worden wanneer je niet een hele klasse wil ontwerpen en uitschrijven. Daarna werken ze net zo als gewone instanties in je application.

Een specifiek doel is voor het tijdelijk opslaan van data uit een csv file, met als doel het in een ander formaat op te slaan. Zeker als er verder geen methoden nodig zijn voor die data.

Note: Records zijn altijd Serialisable , maar je kunt verder geen invloed uitoefenen op de manier waarop de data wordt opgeslagen.

Records via voorbeelden

public record Employee(String id, String firstName, String lastName, String email, int age) { }

Deze declaratie biedt je een object dat geinstantieerd kan worden met de gegeven parameters:

Employee e = new Employee("fbo11", "Frederik", "Bonte", "f.bonte@saxion.nl", 52);

e.id();
e.firstName();
e.lastName();

Dingen die WEL mogen

Records hebben specifieke regels, dus er zijn beperkingen aan wat je wel en niet kunt toevoegen.

Jouw eigen constructor toevoegen

Ja, je mag checks toevoegen die de aangeboden argumenten limiteren, bijvoorbeeld: Je hoeft niet eens alle constructor argumenten te beschrijven.

record Rectangle(double length, double width) {
    public Rectangle {
        if (length <= 0 || width <= 0) {
            throw new java.lang.IllegalArgumentException(
                String.format("Invalid dimensions: %f, %f", length, width));
        }
    }
}

(From docs.oracle.com)

Je mag ook de constructor overloaden, zodat je minder argumenten hoeft mee te geven:

record Rectangle(double length, double width) {
    public Rectangle(double size) {
		this(size, size);
    }
}

Je mag methoden toevoegen

Ja, ook dit is toegestaan, maar als je veel methoden gaat schrijven waarom is dit dan niet gewoon een klasse?

record Rectangle(double length, double width) {
    public double surface() {
		return length()*width();
    }
}

Je mag statische methoden en variabelen toevoegen

In het onderstaande voorbeeld zijn de statische variabelen ook final, maar dat is niet verplicht!

Als het nodig is om een main methode toe te voegen, dan is dat toegestaan.

public record SomeData(int x, int y, Color color) {
	// Please note: final is optional here.
	public static final Color DEFAULT_COLOR = Color.RED;
	
	public SomeData(int x, int y) {
		this(x,y,DEFAULT_COLOR);
	}

	public static void main(String[] args) {
		// This is legal :)
	}
}

Dingen die NIET* toegestaan zijn

Je kunt records niet extenden

Net als de opgeslagen data is de record klasse zelf ook final. Dat betekent dat je geen nieuwe klasse kunt bouwen die een record uitbreidt.

Conclusie

Records besparen tijd om een klasse te ontwerpen. Wanneer je alleen maar even wat data moet bewaren, dan werkt een record prima. Als je echter meer een meer wijzigingen gaat toevoegen aan je record, dan wordt het steeds minder logisch waarom je voor een record koos.