Saturday, May 16, 2009

QnA - Bakit po pare-pareho ang pangalan ng methods at variables?

Ok, our good friend from Symbianize, sir lhandbhel, posted this question. Eto yung code na tinutukoy nya:

public class Card {

public static final int JACK = 11,
QUEEN = 12,
KING = 13,
ACE = 14,
MIN = 2,
MAX = 14;
protected int faceValue;
protected int actualValue;
protected char suit;
protected boolean visible;

public Card(int fv, char s, boolean v){
this(fv,fv,s,v);
}

public Card(int fv, int av, char s, boolean v){
faceValue = (fv >= MIN && fv <= MAX) ? fv : 2;
actualValue = av;

if(s == 'C' || s == 'H' || s == 'D' || s == 'S'){
suit = s;
}
else{
suit = 'C';
}
visible = v;
}

public void setVisible(boolean v){
visible = v;
}

public boolean getVisible(){
return visible;
}

public String toString(){
if(!visible){
return "??";
}
String face;
if(faceValue >= 2 && faceValue <= 10){
face = String.valueOf(faceValue);
}
else{
switch(faceValue){
case JACK:
face = "J";
break;
case QUEEN:
face = "Q";
break;
case KING:
face = "K";
break;
case ACE:
face = "A";
break;
default:
face = "2";
}
}
face += suit;
return face;
}

public void setValue(int av){
actualValue = av;
}
public int getValue(){
return actualValue;
}

public int getFaceValue(){
return faceValue;
}

public static char[] getSuit(){
char[] suits = {'C','H', 'S', 'D'};
return suits;
}

public boolean isPictureCard(){
if (faceValue >= JACK && faceValue <= KING){
return true;
}
return false;
}
}


Ang tanong nya po, bakit nga naman merong dalawang parang method na same ang pangalan:

public Card(int fv, char s, boolean v)
public Card(int fv, int av, char s, boolean v)

First off, di po yan method, its a constructor. Tawag ng iba dyan ay special methods daw. Pero techinically, magkaiba po ang constructor and methods. To po yung difference nila:

1. A constructor will never have an explicit return type. Unlike sa mga methods, may mga statement na kagaya ng 'return x + x' or something similar to that. Or kaya merong nakalagay na 'void' kung walang return type. Ang constructor po walang ganun.
2. di po sya inherited.

Now, para san po ba ang mga constructor? Bale ganto po yan, sa java pag nag-instantiate ka ng new object:

Card kard = new Card(2, 'H', v)

or kaya

Card kard = new Card(2, 3, 'H', v)

yung mga statements na may 'new' na keyword, pag ginamit mo yun, naiinvoke yung mga constructor. Now depende kung ilan yung nilagay mong arguments ang tatawagin ng JVM na constructor. Kung 3 lang, yung unang Card(..) ang tatawagin; kung 4 ang arguments na nilagay mo, yung second ang tatawagin. Ang tawag po dito ay overloaded constructor. Normally isa lang po ang constructor ng isang class. Pero pwede din naman madami, kagaya nitong code na sinend sakin. At yun nga, pag madami ang constructors ang tawag dun ay overloaded constructors.

Nga pala, meron din pong overloaded methods. Kagaya din po ng overloaded na constructor kung pano sila mag work: same name then iba-iba yung dami ng mga parameters. Yung nga lang, instead of constructors, sa methods naman sya. Kagaya nito:

public void doDance(String steps){
....
}

public void doDance(String steps, String musicTitle){
....
}


Regarding sa parehong mga variable names, ok lang po yan kasi diba merong mga scopes ang variables. Example:

public void doDance(String steps){
....
}

Sa method na to meron tayong 'steps' na variable. Pero itong 'steps' na variable na to ay magagamit lang within sa doDance method. Depende kasi kung saan declared yung variable ang lawak ng scope nya. Eto pa ang isang example:

for(int counter = 0; counter <>
...
}


Now hindi mo pwede gamitin sa labas ng for-loop yung 'counter' variable kasi declared sya within the for-loop kaya dun lang scope nya.

Dun po sa code na pinost, ok lang po yan at magwowork kahit may same name. Kasi sa magkaibang constructor naman po sila nilagay. :)

No comments:

Post a Comment