DEV Community

TEJAS-PORWAL
TEJAS-PORWAL

Posted on

Java Unleashed: Tips for Success and Traps to Avoid

Welcome back, dear Readers!๐Ÿ˜€. Welcome to the world of Java, where innovation meets reliability, and every line of code holds the potential to shape the digital landscape. Whether you're a seasoned developer navigating the intricacies of Java's ecosystem or an eager learner taking your first steps into the realm of object-oriented programming, this blog is your guide to mastering Java's nuances, pitfalls, and possibilities. Join us on a journey through the Java Unleashed: Tips for Success and Traps to Avoid, where we'll explore the secrets to writing elegant, efficient code and sidestep the common pitfalls that lurk beneath the surface.
So Let's get started and see them One by One.

Don't Concatenate many Strings
In Java, you can easily merge a few strings into one by using the concatenation operator or the plus sign.

It's easy, quick, and can be freely used when you only have a few strings to concatenate.

However, you may run into serious performance problems when you start concatenating too many strings. Let's see a example to demostrate that

Practice-1

One way to solve this issue is to use StringBuilder or StringBuffer from where we can leverage an inbuilt method 'append' to perform this operation. Here I'm using StringBuffer which is also a threadsafe option.

Output

Output

Note: the time spent may vary here depending on your system performance.


Pick the right datatype for ID
Stop picking int or Integer to store Id.

  • first of all there is a conceptual problem as Integers are numeric datatype they should be used to represent numbers and perform operation on them in a mathematical sense. Now if you think about identifiers do they make sense as mathematical numbers? No right.

  • Also an Identifier may contains leading zeroes which may be useful to represent something meaningful and using int or Integer will not help to retain those leading zeroes as they will be trimmed.

So what's the solution to this problem well you can always go with String as first choice to represent Id. And also to provide the solution to this java provides an UUID(universally unique identifier) class (java.util.UUID) which helps to generate a 36 characters long unique number.

Identifier


Keep your API clean
Make sure your methods and classes arenโ€™t too long. While thereโ€™s no strict rule regarding the exact number of lines or words for a class, itโ€™s advisable to maintain a focused and cohesive structure. When it comes to methods, itโ€™s generally suggested to aim for around 10 to 20 lines of code per method. If a method gets longer, it might be better to split it into smaller, more manageable parts.


Make use of Otional Class in java
Every Java Programmer is familiar with NullPointerException. It can crash your code. And it is very hard to avoid it without using too many null checks. So, to overcome this, Java 8 has introduced a new class Optional in java.util package. It can help in writing a neat code without using too many null checks. By using Optional, we can specify alternate values to return or alternate code to run. This makes the code more readable because the facts which were hidden are now visible to the developer.

Optional Class example


Use @ Override and @ deprecated
In Java, annotations are the metadata that we used to provide information to the compiler. Here, the @ Override annotation specifies the compiler that the method after this annotation overrides the method of the superclass.

It is not mandatory to use @ Override. However, when we use this, the method should follow all the rules of overriding. Otherwise, the compiler will generate an error.
Rules ->

  • Both the superclass and the subclass must have the same method name, the same return type and the same parameter list.
  • We cannot override the method declared as final and static.
  • We should always override abstract methods of the superclass.

@Override

Similarly, if we don't feel the need to use an existing API we should always use @ deprecated which warns other that this API is deprecate and should not be used further for any purpose.

@Deprecated

Program to Interface where appropriate
Always if a matching interface type id available, declare things like parameters, return values, variables and fields using that interface type. Let's see a small example to demonstrate that.

Using Interfaces

Make use of Generics in java
Generics is one of the most useful feature that java offers. So what exactly is Generics in java well the answer to that is simple and easy to understand. Generics are parameterized types. The idea is to allow type (Integer, String, โ€ฆ etc., and user-defined types) to be a parameter to methods, classes, and interfaces. Using Generics, it is possible to create classes that work with different data types. Let's visualize that with an example here

Generics example
Generics also offers few Type parameter which can be picked up based on your requirements

  • T - Type
  • E - Element
  • K - Key
  • N - Number
  • V - Value

Here are some benefits to keep in mind if you intend to use them

Type Safety
Code Reusability
Elimination of Type Casting
Improved Readability and Maintainability
Enhanced Performance
Stronger Abstraction

BONUS TIP
what are view on the below given statement are these One and the same or Not?๐Ÿค”

NOT A GOOD PRACTICE
Not GOOD

A BETTER WAY
Image description

well both the statement has the same meaning but in
the first statement we directly compares the result of whatFruit.getFruitType() with the enum constant FRUITS.APPLE using the equals() method. This approach can potentially lead to a NullPointerException if whatFruit.getFruitType() returns null because calling equals() on null would throw an exception.

And in the second approach we see that it reverses the comparison, checking if the enum constant FRUITS.BANANA is equal to the result of whatFruit.getFruitType(). This approach is safer because it avoids potential NullPointerException. Even if whatFruit.getFruitType() returns null, the comparison will not throw an exception because FRUITS.BANANA is not null.And also make it thread-safe.


To Summarize adhering to best practices in Java is essential for writing clean, maintainable, and efficient code. By following the principles outlined in this article, you can enhance the readability, reliability, and scalability of your Java applications. I hope you can incorporate these best practices into your Java development workflow, you can elevate the quality of your code and become a more proficient Java developer.

Here is the link to my github Repo to check out detailed example on each key points here and some extra info. Do check this out

https://github.com/TEJAS-PORWAL/Java_goodPractice

That's it for this blog see you all next time with something new.

Top comments (2)

Collapse
 
tejasmn profile image
Tejas M N

Great!!

Collapse
 
tejasporwal profile image
TEJAS-PORWAL

Thanks bro๐Ÿค