You have a Student data in the database . To return student data, you may write modal class as below.
public class Student {
private int rollNumber;
private String name;
private String address;
public Student(int rollNumber, String name, String address) {
super();
this.rollNumber = rollNumber;
this.name = name;
this.address = address;
}
public int getRollNumber() {
return rollNumber;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
@Override
public int hashCode() {
return Objects.hash(address, name, rollNumber);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Student)) {
return false;
}
Student other = (Student) obj;
return Objects.equals(address, other.address) && Objects.equals(name, other.name)
&& rollNumber == other.rollNumber;
}
}
private int rollNumber;
private String name;
private String address;
public Student(int rollNumber, String name, String address) {
super();
this.rollNumber = rollNumber;
this.name = name;
this.address = address;
}
public int getRollNumber() {
return rollNumber;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
@Override
public int hashCode() {
return Objects.hash(address, name, rollNumber);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Student)) {
return false;
}
Student other = (Student) obj;
return Objects.equals(address, other.address) && Objects.equals(name, other.name)
&& rollNumber == other.rollNumber;
}
}
- Here We have created Student modal with three fields .
- It has a constructor to create Student object.
- It has getter methods to read student data.
- It also has overriden hashcode and equals methods to avoid duplicates.
- If you have multiple tables, You need to all this boiler plate code for all the modal classes.
- To avoid boiler plate code , We can use lombok library.
- We can rewrite the above Student modal class as below using lombok library.
@Data
public class Student {
private int rollNumber;
private String name;
private String address;
}
- Instead of using lombok library, We can use Java record.
- Record is special class which is used to store read only data.
- We can create a record using record keyword.
record recordName(variables declaration) {
//optional body
}
- We can write the above Student modal class using record as below
public record Student(int rollNumber, String name, String address) {
}
- We must declare variables within record parenthesis. These are private and final by default.
- Java compiler automatically creates constructor , getter methods, toString, equals , hashCode methods for these variables.
- Java will not generate setter methods. Because record is immutable. Once we have created record object, we can't modify it's data.
- We can use record keyword as variable name also.
- We can create record object using new keyword.
public record Student(int rollNumber, String name, String address) {
}
public class Test {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
var student1 = new Student(1, "Hari", "Nellore");
var student2 = new Student(2, "krishna", "Chennai");
studentList.add(student1);
studentList.add(student2);
studentList.forEach(studentObj->{
System.out.println(studentObj.rollNumber()+" "+studentObj.name()+" "+studentObj.address());
});
} }
Output
1 Hari Nellore
2 krishna Chennai
- We can use generics with record.
- Static variables are allowed within record body. Instance variables are not allowed within record body.
- Both Static and instance methods are allowed to write inside record.
- Abstract method is not allowed.
How to write our own constructor in record:
- Normally Java compiler generated constructor is sufficient.
- We may need to implement our own constructor to write validation conditions. For example if the name is empty or null throw an IllegalArgumentException exception.
- We can implement constructor in two ways.
- Canonical constructor
- Non Canonical constructor
Canonical constructor
- We can write canonical constructor in two forms . one is full form, other one is compact form.
- Let's write canonical constructor in full form
- Here constructor parameters should match exactly as the variables defined in record definition . Variables type , name and order must be same.
- You can write same constructor using compact form as follows.
- We don't need to declare constructor parameters.
- We don't need to initialize the record variables.
- At end of constructor , constructor parameters are automatically assigned to corresponding record variable.
- This constructor is useful when we want to add default values for some fields while creating record object.
- We must call canonical constructor as first statement inside this constructor.
- Here we are using this keyword to call canonical constructor. Address field data is default Nellore for all record objects.
This is a very helpful blog for me as I am pursuing Java Fullstack development course From Fullstack Guru Pune which offers best Java Training in Offline and Online Mode.
ReplyDeletevery useful and informative blog.
ReplyDeleteFull stack classes in Pune
Nice blog.Thanks for sharing.
ReplyDeleteJava Classes in Nagpur
informative blog java classes in satara
ReplyDeletevery informative, thanks for sharing this information. Full Stack Course In Pune
ReplyDelete