🚨 Java is finally fixing “final” — and it’s a BIG deal for backend devs For years, we trusted this: final String name = "Alok"; 👉 Meaning: this value will never change But under the hood… that wasn’t always true 😶 Using reflection: Field f = User.class.getDeclaredField("name"); f.setAccessible(true); f.set(user, "Hacked"); 💥 Your "final" field could still be modified No error. No warning. (Yes, since JDK 5!) --- 🤯 Why was this allowed? Because popular frameworks relied on it: • Jackson / Gson → deserialization • Hibernate → entity hydration • Mockito → mocking • Old DI → field injection 👉 Reflection made it possible to break immutability --- 🚨 What’s changing now? With Java 26 (JEP 500): ➡️ “Prepare to Make Final Mean Final” ✔️ Today: You’ll see warnings ❌ Tomorrow: It will be blocked (error) --- ⚠️ Why this matters This is not just syntax — it impacts: 🔹 Thread safety (immutability = safe concurrency) 🔹 JVM optimizations (compiler trusts "final") 🔹 Security (no hidden mutation) --- 🛠️ What you should do NOW ✅ Prefer constructor injection private final Service service; public MyClass(Service service) { this.service = service; } ✅ Use immutable DTOs (Java Records) public record UserDTO(String name, int age) {} ✅ Update libraries (Jackson, Hibernate, Mockito) ✅ Run your app on newer Java & check warnings --- 💡 Final Thought 👉 “final” was never truly final… until now. And honestly — it’s about time. --- #Java #SpringBoot #Backend #JavaDeveloper #CleanCode #JVM #Programming #SoftwareEngineering
Alok Tripathi’s Post
More Relevant Posts
-
🚦 Thread Safety in Java - Why Your Code Breaks Under Concurrency Your code works perfectly with 1 user. But when multiple threads hit the same object together… chaos starts. Two threads may try to update the same data at the same time → causing race conditions, inconsistent values, and hard-to-debug production issues. 🔍 What is Thread Safety? A class or block of code is called thread-safe when it behaves correctly even when accessed by multiple threads simultaneously. Meaning: ✔ No corrupted data ✔ No unexpected outputs ✔ Predictable execution ⚠ Common Problem count++; Looks harmless, right? But internally it is: 1. Read count 2. Increment 3. Write back If two threads do this together, one update can be lost. ✅ How Java Handles Thread Safety 1. synchronized keyword Allows only one thread at a time inside critical section. public synchronized void increment() { count++; } 2. Atomic Classes For lightweight thread-safe operations. AtomicInteger count = new AtomicInteger(); count.incrementAndGet(); 3. Concurrent Collections Use thread-safe collections like: 1. ConcurrentHashMap 2. CopyOnWriteArrayList instead of normal HashMap/List in multithreaded apps. 4. Immutability Objects that never change are naturally thread-safe. 💡 Rule of Thumb If multiple threads share mutable data, protection is mandatory. Otherwise bugs won't appear in local testing... they appear directly in production 😄 👉 If you are preparing for Java backend interviews, connect & follow - I share short, practical backend concepts regularly. #Java #Multithreading #ThreadSafety #BackendDevelopment #SpringBoot #JavaDeveloper #Programming #InterviewPrep #Concurrency #SoftwareEngineering
To view or add a comment, sign in
-
-
Java 17 Feature: Record Classes What is a Record Class? A record class is mainly used to create DTOs (Data Transfer Objects) in a simple and clean way. Why DTOs? DTOs are used to transfer data: • Between services • From backend to frontend Key Features of Record Classes: Immutable by default (data cannot be changed after creation) Less code (no need to write getters, constructors, etc.) When you create a record, Java automatically provides: Private final fields All-arguments constructor Getter methods (accessor methods) toString(), equals(), hashCode() Example: public record Customer(int customerId, String customerName, long phone) {} Usage: Customer customer = new Customer(1011, "John", 9890080012L); System.out.println(customer.customerId()); Important Points: Record class is implicitly final Cannot extend other classes Internally extends java.lang.Record Can implement interfaces (normal or sealed) Can have static methods and instance methods Cannot have extra instance variables With Sealed Interface: public sealed interface UserActivity permits CreateUser, DeleteUser { boolean confirm(); } public record CreateUser() implements UserActivity { public boolean confirm() { return true; } } Before Java 17: We used Lombok to reduce boilerplate code. After Java 17: Record classes make code: Cleaner Shorter Easier to maintain #Java #Java17 #BackendDevelopment #FullStackDeveloper #Programming #SoftwareEngineering
To view or add a comment, sign in
-
🧠 JVM Memory & Garbage Collection Let me explain Java memory using your HOUSE as an example 🏠👇 🏠 JVM = Your House Your Java app lives here. Different rooms, different purposes. 📦 Heap = The Storeroom All objects go here. Never clean it? It crashes → OutOfMemoryError 💥 Heap has sections: 👶 Young Gen → new stuff (dies fast) 🧓 Old Gen → stuff you kept for years 🏷️ Metaspace → labels about your stuff 🪑 Stack = Your Desk Small, fast. Holds current work (method calls, local variables). Cleans itself when work is done. No GC needed! 🧹 Garbage Collection = Mom Cleaning Your Room “Do you still need this? No? GONE.” Java finds unused objects and removes them automatically. But sometimes GC yells: “EVERYBODY FREEZE while I clean!” ⏸️ These Stop-the-World pauses make apps laggy. 🔧 Choose Your Cleaner: 🟢 G1 → good all-rounder 🔵 ZGC → almost zero pauses 🟡 Shenandoah → low-latency beast 🔴 Serial → tiny apps only 📝 String Pool = Shared Notebook String a = “Hello”; String b = “Hello”; Java keeps ONE copy. Both point to it. Memory saved! 🎯 ⚡ Make Your App Faster: → Create only objects you need → Set unused objects to null → Close DB connections always → Remove unused listeners → Tune heap with -Xms and -Xmx → Profile with VisualVM or JConsole 🚨 Memory Leak Culprits: ❌ Unclosed DB connections ❌ Static lists that grow forever ❌ Listeners never unsubscribed ❌ Huge data in user sessions 🎯 Recap: 🏠 JVM = House 📦 Heap = Storeroom 🪑 Stack = Desk 🧹 GC = Auto cleaner 📝 String Pool = Shared notebook 🚨 Leaks = Stuff you forgot to toss Clean heap = Fast app 🏃💨 #Java #JVM #GarbageCollection #HeapMemory #JavaDeveloper #Programming #CodingTips #SoftwareEngineering #LearnJava #DevCommunity #100DaysOfCode #JavaPerformance #MemoryManagement #CleanCode #JavaInterview #BackendDevelopment
To view or add a comment, sign in
-
🚨 Java 26 is out. And most people are asking the wrong question. "Why so fast?" isn't the right concern. The right one is: are you actually using what Java already gave you? Java moved to a 6-month release cadence in 2018. That's not speed for the sake of speed — it's incremental pressure on the runtime, informed by real production feedback. And Java 26 continues exactly that. Here's what actually matters in this release — and why it's more subtle than it looks: Virtual Threads are maturing. Not new. But the edge cases that broke thread-local assumptions in frameworks like Hibernate and Spring are being addressed. If your team avoided Project Loom because of compatibility concerns — that wall is getting shorter. ZGC sub-millisecond pauses are now the expectation, not the exception. If your application still shows GC pauses above 5ms under load, that's not a Java problem anymore. That's a tuning problem. The JVM held up its end of the deal. The JIT keeps getting smarter about escape analysis. Short-lived objects that never leave a method scope increasingly never hit the heap at all. Stack allocation, no GC pressure. If you're still pre-allocating object pools "for performance" without profiling first — you might be solving a problem the JVM already solved. The pattern across all of this? The JVM is absorbing complexity so your architecture doesn't have to. The question was never "why Java 26 so soon." It's: are you writing code that takes advantage of a runtime this good? 💬 What's the one JVM behavior you've had to work around that you suspect modern Java already handles? #Java #JVM #Backend #SoftwareEngineering #Performance #VirtualThreads
To view or add a comment, sign in
-
-
Day 12 Today’s Java practice was about solving the Leader Element problem. Instead of using nested loops, I used a single traversal from right to left, which made the solution clean and efficient. A leader element is one that is greater than all the elements to its right. Example: Input: {16,17,5,3,4,2} Leaders: 17, 5, 4, 2 🧠 Approach I used: ->Start traversing from the rightmost element ->Keep track of the maximum element seen so far ->If the current element is greater than the maximum, it becomes a leader ->This is an efficient approach with O(n) time complexity and no extra space. ================================================= // Online Java Compiler // Use this editor to write, compile and run your Java code online class Main { public static void main(String[] args) { int a [] ={16,17,5,3,4,2}; int length=a.length; int maxRight=a[length-1]; System.out.print("Leader elements are :"+maxRight+" "); for(int i=a[length-2];i>=0;i--) { if(a[i]>maxRight) { maxRight=a[i]; System.out.print(maxRight+" "); } } } } Output:Leader elements are :2 4 5 17 #AutomationTestEngineer #Selenium #Java #DeveloperJourney #Arrays
To view or add a comment, sign in
-
-
🚀 Java 25 Innovation Alert: Compact Object Headers (COH)!🚀 If you’re working with large-scale Java applications, this JVM feature is a game-changer you might not know about — but it silently makes your apps faster, leaner, and more efficient. Let me break it down 👇 ✨ What are Compact Object Headers? In Java, every object has a little metadata block called the object header — storing info like: 🧠 Object hash codes 🗂️ Garbage Collection (GC) data 🔐 Lock states for synchronization 📚 Class metadata pointers Traditionally, these headers can take 16 to 24 bytes each on a 64-bit JVM — and when you have millions (or billions!) of objects, memory usage quickly balloons. 🔧 Java 25 to the rescue! With Compact Object Headers, the JVM compresses these metadata pieces: Mark Word (GC info, locks, hash) gets squeezed into fewer bytes Klass Pointer (class info) uses half the space Rare flags move out of the header into auxiliary space 💡 The result? Object headers shrink to ~8–12 bytes on average. 🔥 Why this matters: 🏋️ Save gigabytes of memory in large applications ⚡ Boost CPU cache locality & speed up access 🧹 Lower GC overhead, improving pause times and throughput 💻 Free up heap space for your actual data and logic ⚙️ How to enable COH in Java 25: By default, if your heap is under 32GB and compressed pointers (OOPs) are enabled, COH kicks in automatically. You can manually turn it on with: -XX:+UseCompactObjectHeaders Check it with: java -XX:+PrintFlagsFinal -version | grep CompressedOops ✅ Takeaway: You don’t have to change your code—this JVM-level magic makes your Java apps more memory-efficient and performant right out of the box. If you’re architecting Java systems at scale, COH is a subtle but powerful tool in your toolbox. #Java #JVM #Performance #MemoryManagement #Java25 #TechTips #SoftwareEngineering #Programming
To view or add a comment, sign in
-
-
Is your Java knowledge still stuck in 2014? ☕ Java has evolved massively from version 8 to 21. If you aren't using these modern features, you’re likely writing more boilerplate code than you need to. I’ve been diving into the "Modern Java" era, and here is a quick roadmap of the game-changers: 🔹 Java 8 (The Foundation) 1. Lambda Expressions 2. Stream API 3. Optional 🔹 Java 11 (The Cleanup) 1.New String Methods – isBlank() and repeat() are life-savers. 2.HTTP Client – Finally, a modern, native way to handle REST calls. 3.Var in Lambdas – Cleaner syntax for your functional code 🔹 Java 17 (The Architect's Favorite) 1.Records – One-line immutable data classes. No more boilerplate! 2.Sealed Classes – Take back control of your inheritance hierarchy. 3.Text Blocks – Writing SQL or JSON in Java is no longer a nightmare. 🔹 Java 21 (The Performance King) 1.Virtual Threads – High-scale concurrency with zero overhead. 2.Pattern Matching – Use switch like a pro with type-based logic. 3.Sequenced Collections – Finally, a standard way to get first() and last(). Java isn't "old"—it's faster, more concise, and more powerful than ever. If you're still on 8 or 11, it’s time to explore what 17 and 21 have to offer. #Java #SoftwareEngineering #Backend #Coding #ProgrammingTips #Java21
To view or add a comment, sign in
-
Built an HTTP server from scratch in Java. No frameworks. No Netty. No Spring Boot. Just raw sockets, manual byte parsing, and a thread pool wired from the ground up. The goal was never to reinvent the wheel. It was to understand what the wheel is actually made of. What was built: → TCP socket listener handing connections to a fixed thread pool of 500 workers → HTTP/1.1 parser written byte-by-byte - request line, headers, body (JSON + form-urlencoded) → Router handling HEAD, GET and POST with static file serving and query param injection → Structured error responses for 400, 404, 500, 501, and 505 → WebRootHandler with path traversal protection → Full JUnit test suite, Maven build, SLF4J logging, and a Dockerized deployment What it reinforced: Networking - HTTP is just bytes on a wire. The kernel speaks TCP, not HTTP. The parser is what gives those bytes meaning. Operating systems - the boundary between user space and kernel space stopped being abstract. accept(), read(), write() are syscalls. Everything else lives in the JVM. Concurrency - 500 threads sharing a single handler. Statelessness stops being a design preference and becomes a correctness requirement. Docker - the container wraps the JVM, not the kernel. Syscalls go to the host kernel. There is no container kernel. Building something from scratch is one of the most honest ways to learn. Every assumption gets tested, every abstraction gets earned. A recommendation from Kashif Sohail turned into weeks of going deep on networking, OS internals, and concurrency. Grateful for that push. GitHub repo :https://lnkd.in/dxxjXxpt #Java #Networking #OperatingSystems #Backend #SystemsEngineering #Docker #OpenSource
To view or add a comment, sign in
-
-
🚀 Java 25 Innovation Alert: Compact Object Headers (COH)! 🚀 If you’re working with large-scale Java applications, this JVM feature is a game-changer you might not know about — but it silently makes your apps faster, leaner, and more efficient. Let me break it down👇 ✨ What are Compact Object Headers? In Java, every object has a little metadata block called the object header — storing info like: 🧠 Object hash codes 🗂️ Garbage Collection (GC) data 🔐 Lock states for synchronization 📚 Class metadata pointers Traditionally, these headers can take 16 to 24 bytes each on a 64-bit JVM — and when you have millions (or billions!) of objects, memory usage quickly balloons. 🔧 Java 25 to the rescue! With Compact Object Headers, the JVM compresses these metadata pieces: Mark Word (GC info, locks, hash) gets squeezed into fewer bytes Class Pointer (class info) uses half the space Rare flags move out of the header into auxiliary space 💡 The result? Object headers shrink to ~8–12 bytes on average. 🔥 Why this matters: 🏋️ Save gigabytes of memory in large applications ⚡ Boost CPU cache locality & speed up access 🧹 Lower GC overhead, improving pause times and throughput 💻 Free up heap space for your actual data and logic ⚙️ How to enable COH in Java 25: By default, if your heap is under 32GB and compressed pointers (OOPs) are enabled, COH kicks in automatically. You can manually turn it on with: -XX:+UseCompactObjectHeaders Check it with: java -XX:+PrintFlagsFinal -version | grep CompressedOops ✅ Takeaway: You don’t have to change your code—this JVM-level magic makes your Java apps more memory-efficient and performant right out of the box. If you’re architecting Java systems at scale, COH is a subtle but powerful tool in your toolbox. #Java #JVM #Performance #MemoryManagement #Java25 #TechTips #SoftwareEngineering #Programming
To view or add a comment, sign in
-
-
🚀 Understanding the Diamond Problem in Java (with Example) The Diamond Problem happens in languages that support multiple inheritance—when a class inherits the same method from two different parent classes, causing ambiguity about which one to use. 👉 Good news: Java avoids this completely for classes. 🔒 Why Java Avoids It - Java allows single inheritance for classes → no ambiguity. - Uses interfaces for multiple inheritance. - Before Java 8 → interfaces had no implementation → no conflict. - After Java 8 → "default methods" can create a similar issue, but Java forces you to resolve it. --- 💥 Problem Scenario (Java 8+ Interfaces) interface A { default void show() { System.out.println("A's show"); } } interface B { default void show() { System.out.println("B's show"); } } class C implements A, B { // Compilation Error: show() is ambiguous } 👉 Here, class "C" doesn't know whether to use "A"'s or "B"'s "show()" method. --- ✅ Solution: Override the Method class C implements A, B { @Override public void show() { A.super.show(); // or B.super.show(); } } ✔ You explicitly choose which implementation to use ✔ No confusion → no runtime bugs --- 🎯 Key Takeaways - Java design prevents ambiguity at the class level - Interfaces give flexibility but require explicit conflict resolution - Always override when multiple defaults clash --- 💡 If you think Java is "limited" because it doesn’t allow multiple inheritance… you're missing the point. It’s intentional design to avoid chaos, not a limitation. #Java #OOP #Programming #SoftwareEngineering #Java8 #CleanCode
To view or add a comment, sign in
-
Explore related topics
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development