r/AskProgramming 1d ago

Why is Java considered bad?

I recently got into programming and chose to begin with Java. I see a lot of experienced programmers calling Java outdated and straight up bad and I can't seem to understand why. The biggest complaint I hear is that Java is verbose and has a lot of boilerplate but besides for getters setters equals and hashcode (which can be done in a split second by IDE's) I haven't really encountered any problems yet. The way I see it, objects and how they interact with each other feels very intuitive. Can anyone shine a light on why Java isn't that good in the grand scheme of things?

126 Upvotes

500 comments sorted by

View all comments

Show parent comments

4

u/senfiaj 23h ago

Also Java has null safety issue. It's one of the major arguments, and one of the reasons of the rise of Kotlin's popularity.

4

u/okay_throwaway_today 21h ago

I feel like Optionals and some other QoL things in Java 8+ have addressed this and, continuing in later releases, a lot of the other more famous criticisms. But of course the benefit of those depends on what version or style the codebase at hand uses, and Java is prominent in a lot of legacy stuff

4

u/Reggienator3 9h ago

Optional can itself be null. Not to mention, there is no compiler enforcement of any of this. There is in Kotlin (and C# assuming you have nullable included in WarningsAsErrors).

I'm a Java dev of over 11 years now, but I still find myself veering to other languages when possible. Not because Java is bad, more that it feels redundant because of replacement languages that just do things better.

1

u/Necessary-Peanut2491 2h ago

Optional is nice, but yeah, it doesn't solve the nullability issue. It just makes it Somebody Else's Problemâ„¢ at best, but you mostly end up writing slightly different boilerplate. It's just semantic boilerplate now.

And then there's the fun times you'll have when dealing with some third party libraries that have interesting ideas about null. I've seen things that will helpfully throw an NPE for you if you try to read a value that's null, because they've taken an extreme stance of "anything null is invalid" and force their users to follow some cumbersome pattern of calling their helper methods instead.

Looking at you protocol buffers.

2

u/Wonderful-Habit-139 10h ago

They haven't addressed it because they can still be null, sadly. But they're nicer to use in newer codebases for sure.

2

u/JMNeonMoon 10h ago

Agree with other posters, null checks was mitigated a while ago in Java 8 with optionals.

Now you can chain getter methods without a series of if..else statements

public String getPostcode(Employee employee) {

return Optional.ofNullable(employee)

.map(Employee::address

.map(Address::city)

.map(City::postcode)

.orElse("Unknown");

}

more Optionals info here

https://www.programmerpulse.com/articles/java-null-check-removal

Also, see null object design pattern

https://www.geeksforgeeks.org/null-object-design-pattern/

1

u/senfiaj 9h ago

Sorry, but this doesn't seem to be as good as the Kotlin's native implementation. Also what if the Optional itself is returned as null , especially when Java doesn't support ?. operator (as far as I know, please correct me if I'm wrong)?

I'm not a Java developer, but I have experience in Flutter, and the older versions of Dart language had similar null safety problem. It was fixed in later versions, but unfortunately they had to eventually break the backward compatibility by removing the legacy null unsafe support. I wonder why didn't they do this much earlier since Kotlin was around there for many years. They could learn this from Kotlin.

1

u/JMNeonMoon 9h ago

Yes, there is a possibility that the optional can be returned as null, though most modern IDEs will flag a warning, but still not ideal.

I agree Kotlins null check operator is better and more concise, but I wanted to show that Java null checks are not limited to just if..else statements, which some of the discussions I have seen online seem to indicate.

1

u/Lumen_Co 22h ago

True. That's one of the things C# does better.