top | item 42004834

(no title)

Kipters | 1 year ago

> That's basically modern-day Java, with Lombok and other tidbits.

I wouldn't call Lombok "modern", more like "a terrifyingly hacky way to tackle limitations in the language despite the unwillingness to make the language friendlier" and a far cry from what source generators can do in C#

discuss

order

Ygg2|1 year ago

Hack or not, it's been working relatively well for the past decade.

But even, if you account for that, the records in Java do most of what Lombok used to do - make class externally immutable, add default `toString`, `equals` and `hashCode` implementations, allow read-only access to fields.

> what source generators can do in C#

Having had the displeasure of developing source generators in C# (in Rider), what they do is make code impossible to debug while working on it. On top of relying on an ancient version of netstandard.

I cannot emphasize enough how eldritch working on them is. While developing, whatever change you write isn't reflected when you inspect codegen code, and caching can keep old code beyond even post re-compilation unless you restart the build server, or something.

So whenever you try to debug your codegen libs, you toss a coin:

- heads it shows correct code

- tails it's showing previously iteration of code gen code, but the new code is in, so the debugger will at some point get confused

- medusae it's showing previous iteration of code gen code, but new code hasn't been propagated, and you need to do some arcane rituals to make it work.

Hell, even as a user of codegen libs, updating codegen libs caused miscompilation because it was still caching the previous codegen version.

Kwpolska|1 year ago

> relying on an ancient version of netstandard

They require 2.0, which is the only version that is actually useful, since it supports .NET Framework 4.x.v

xxs|1 year ago

Getters and setters are a mediocre design choice, not a limitation. Records have existed for years, too.

e3bc54b2|1 year ago

> Records have existed for years

As a fan of Records, this is a punch to the gut.

The ecosystem is years and years away from using records. Almost every huge monolith decade+ project is still on Java 8, those who moved to something new still can't be liberal with them, because oh look, none of the serialize/deserialize libs can work with them because everything, to this day, abuses reflection for generating objects like a giant fucking hack it is.

Apology for the rant, but I migrated a big project to 21 early this year, am in the middle of migrating another 1M+ line codebase to 21, and the sorry state of records is such a sad thing to witness.

I give a decade before records are anything but 'a fancy feature'.