Java :Setter Getter and constructor

89,167

Solution 1

default constructor is always there

Well actually its not always there. A default constructor is the one which is provided by the compiler (of course it is a no-arg constructor ) Only if there is no other constructor defined in the class

why we use constructor with parameters to initialize values instead of set get

Because there could be a condition that an object can always be created only when all the values are provided at the time of initialization itself and there is no default value. So all values must be provided otherwise code will not compile.

Consider this Book class

public class Book {

    private String title;
    private String author;

    public Book(String title, String author){
        this.title = title;
        this.author = author;
    }
     //getters and setters here 
}

Consider a condition where a book can be created only if it has title and author.

  • You cannot do new Book() because no-arg constructor is absent and compiler will not provide one because one constructor is already defined.
  • Also you cannot do new Book() because our condition does not meet as every book requires a title and author.

This is the condition where parameterized constructor is useful.

Solution 2

Sometimes, when creating a new object of a class, some values HAVE TO be provided. For an example, when connecting to database and creating Connection class object you have to provide a connection string, so that it knows what are you connecting to. Creating new connection without specyfing target database would be pretty useless, right?

Also, take a look at this

Foo foo=new Foo(1,2,3,4,5,6,7);

and this

Foo foo=new Foo();
foo.setP1(1);
foo.setP2(2);
foo.setP3(3);
foo.setP4(4);
foo.setP5(5);
foo.setP6(6);
foo.setP7(7);

First one looks better, right?

Solution 3

My question is that if constructor is point of initialization and default constructor is always there so why we use constructor with parameters to initialize values instead of set get.

If you think about an object transitioning into different states then it makes sense to have a parameterized constructor alongwith setters and getters. Let me try to put a real life scenario: Think about an Employee class, a new employee joins, you don't know many details but few and you create the object of Employee with defualt and base value of its attributes. You need to register the employee in the system and hence you used the parameterized constructor. Once you get more details about the employee, you use getters and setters to update the attributes.

Solution 4

this is purely upto your coding style. But IMO, I would use parametrized constructor:

  1. to initialize those values which should not be changed. (like username parameter for a person object)

  2. to initialize those values, without setting which, the object will be in invalid state.

Say, you are sending login parameters to a method. You can use in these to ways

Login obj = new Login();
obj.setUsername("user");
obj.setPassword("pw")// what if someone commented this out, or you forget to call it


and otherway,
Login obj = new Login("user", "pw");

while you can send Login object just after setting username in 1st case, it would be invalid at recieving end. but the second method is less prone to bugs, bcz it becomes necessary to pass all the required parameters.

Solution 5

Sometimes you don't need to set all the fields to specific values at the time of creating. For examle, when you make an array. Also, as already said, it's safer when you use getters -- you can't get nullpointer.

Remember to write the default constructor when you've defined constructor with parameters. Or be sure not to use it.

Share:
89,167
Java Student
Author by

Java Student

Updated on September 30, 2020

Comments

  • Java Student
    Java Student over 3 years

    I'm a bit confused about the use of getter/setters and constructors (see the below code for an example)

        public class ExampleClass {
    
            private int value = 0; 
    
            public ExampleClass () {
                value = 0; 
            }
    
            public ExampleClass (int i) {
                this.value = i;
            }
    
            public int getValue() {
                return value; 
            }
    
            public void setValue(int val) {
                this.value = val; 
            }
    
            public static void main(String[] args) {     
                ExampleClass example = new ExampleClass (20);
                example.setValue(20); 
                //Both lines above do same thing - why use constructor? 
                System.out.println(example.getvalue());
            }
       }
    

    All I've learned is that we need getters/setters for security and that they can also be used to change or edit values later on.

    My question is that if the constructor is the point of initialization and a default constructor is always present, why use a constructor with parameters to initialize values instead of getters/setters?. Wouldn't using the getter and setter provide security as well being able to easily change values at any stage. Please clarify this point for me.