Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run methods before and after Lombok @Setter

Tags:

java

lombok

I want some of my methods to run before and after the Lombok @Setter. For example:

@Setter(after="save")
private String name;

This should run method called "save" after the original setter has assigned a value to the field. So after compilation it should look like this:

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

Maybe there is something I could do with "onMethod" parameter? Sorry, I'm not professional in annotations.

like image 563
Rubix327 Avatar asked Oct 18 '25 12:10

Rubix327


1 Answers

There is currently indeed no way to do this; onMethod isn't going to help either (SOURCE/DISCLAIMER: I'm a core lombok dev).

We do have some plans to add such a thing, but before you go ahead and write a PullRequest to add such a feature, discuss it first. There are various ways to go here. The primary issue is syntax.

You can't put java code in an annotation (you can put it in a string but we veto such a move; your IDE is not going to help you, it's got the wrong syntax highlighting, and so on). You can't, unfortunately, put a method reference in an annotation either. You could put a string in there that mentions a method but we don't like that either (again, wrong colouring, no IDE autocomplete support).

That leaves magic naming (you make a method called afterName), but at that point lombok saves you nearly nothing, so why not just write the setter. A second option is to have a single 'validate' method that is called after any setter and is e.g. marked by an annotation. That's more the direction we're leaning into.

There's more to consider: Sometimes you'd want to mutate the incoming value before assigning it, and the same mutation should be done in case you have a builder, or have a constructor that accepts this param, as well. Thus, we have:

  • Post-set actions after any setter and construction, such as save().
  • Pre-"setting", validate and/or mutate, after any setter and construction. For example, let's say you have a setAge() method and you want to throw an exception if someone attempts to pass a negative value. The set shouldn't even happen, so a post-set handler can't do the job (it'd be too late, the object is already in an invalid state and you'd want to avoid this). Complication: Given that we want to do this pre-setting the field, how does this method get the values, then?

Hopefully that illustrates why this feature isn't (yet) in lombok and why it's a matter of a simple PR to add it.

like image 72
rzwitserloot Avatar answered Oct 20 '25 01:10

rzwitserloot



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!