Advanced Programming
SUT • Spring 2019
Init methods
Constructors
No Destructor
Initialization
Cleanup
An instantiated object, is not a ready object
It may be and invalid object
Person p = new Person();
p is an object without name, id and, …
p is an invalid object
It should be initialized
public class Student {
//Mandatory
private String name;
private long id;
//Optional
private String homepage;
public void setName(String name) {
if (name != null && !"".equals(name.trim()) &&
name.matches("[a-zA-Z ]+"))
this.name = name;
}
public void setId(long id) {
if (id > 10000000 && id < 100000000)
this.id = id;
}
public void setHomepage(String homepage) {
homepage = homepage;
}
}
public void init(String name, long id) {
setName(name);
setId(id);
}
public static void main(String[] args) {
Student st = new Student();
// st is an invalid object now
st.init("Hossein Alizadeh", 45205068);
// st is initialized now. ready to be used
System.out.println(st.getName());
System.out.println(st.getId());
}
Circle c = new Circle();
c.init(12);
Book b1 = new Book();
b1.init(“من او”, “رضا اميرخانی”);
Book b2 = new Book();
b2.init(“شاهنامه”, “ابوالقاسم فردوسی”);
What are the disadvantages of init() method?
Init method is invoked manually
There is no guarantee for init invocation
Before calling init method, the object has an invalid state
Constructor is a special method
With the same name as the class
Without any return type
A constructor is called when an object is instantiated
No invalid object
public class Circle {
private double radius;
public Circle(double r) {
radius = r;
}
public double getArea() {
return this.radius * this.radius * 3.14;
}
public static void main(String[] args) {
Circle c = new Circle(2);
System.out.println(c.getArea());
}
}
Constructors may have parameters
Default constructor: no parameter
Is implicitly implemented
You can write your own default-constructor
If you write any constructor, default implicit constructor is vanished.
public class Circle {
private double radius;
public Circle(double r) {
radius = r;
}
public Circle() {
System.out.println("Default Constructor");
}
public double getArea() {
return this.radius * this.radius * 3.14;
}
public static void main(String[] args) {
Circle c = new Circle(2);
System.out.println(c.getArea());
}
}
Default Constructor
Constructor
Java needs no destructor
Destructor method in C++
Java has a finalize() method
You can implement it for your class
Java has no destructor
Java has a special method: finalize
finilize() is called when the object is garbage-collected
If garbage collector is not invoked
finalize() method is not called
Why we may need finalize?
Garbage collection is only about memory
public class Circle {
private double radius;
public Circle(double r) {
radius = r;
}
public String toString() {
return "Circle [radius=" + radius + "]";
}
public void finalize() throws Throwable {
System.out.println("Finalize: " + toString());
}
public static void main(String[] args) {
f();
System.gc();
}
private static void f() {
Circle c = new Circle(2);
System.out.println(c);
}
}