tags:

views:

78

answers:

4

hi i am a totally new guy on JAVA OO concepts ,and this is my first time programming,i am currently stuck on how to create a registration class and a class which will store all the registration info, this is what i have done, 4 classes, a Account class, a Staff class extend Account,a Student class extend Account, and a dataStorage class to store the informations and to extract them when needed.

public class Account {

 private String name;
 private String department;
 private String username;
 private String password;

 public Account()
 {
 } 
    public Account(String nm,String dep,String user,String pass) 
    {
     name = nm;
       department = dep;
     username = user;
     password = pass;
    }

    public void setName(String nm)
    {
     name = nm;
    }

    public String getName()
    {
    ..... other accessors
}

/**/

public class Student extends Account {

 private String studentNRIC;
 private String studentID;

 public Student(String n, String nr, String id, String dep, String user, String pass)
 {
  super(n, dep, user, pass);
  studentNRIC = nr;
  studentID = id;
 }

    public void setStudentNRIC(String nr)
    {
     studentNRIC = nr;
    }

    public String getStudentNRIC()
    {
     return studentNRIC;
    }
    ....accessors

}

/**/

public class Staff extends Account {

 private String staffID;

 public Staff(String n, String id, String dep, String user, String pass)
 {
  super(n, dep, user, pass);
  staffID = id; 
 }

    public void setStaffID(String id)
    {
     staffID = id;
    }

    public String getStaffID()
    {
     return staffID;
    }


}

/**/ import java.util.*;

public class DataStorage 
{
    ArrayList<Account> staff = new ArrayList<Account>();      
    ArrayList<Account> student = new ArrayList<Account>();  

    public DataStorage(Staff aAcc) 
    {
     staff.add(aAcc);
    }

    public DataStorage(Student aAcc)
    {
     student.add(aAcc);
    }

    public String msg()
    {
     Staff sf = staff.get(0);


    return staff;
    }
}
A: 

Your DataStorage class needs some corrections:

public class DataStorage 
{
    ArrayList<Account> staffMembers = new ArrayList<Account>();      
    ArrayList<Account> students = new ArrayList<Account>();  

    // Default constructor
    public DataStorage() {
    }

    public void addStaffMember(Staff aAcc) 
    {
     staffMembers.add(aAcc);
    }

    public void addStudentMember(Student aAcc)
    {
     students.add(aAcc);
    }

    public Student getStudentById(String id)
    {
    }

    // More retrieval methods
}

You will usually want to hava more retrieval methods (get by department, name, id). Some will return a single item and some a list. If you are only interested in retrieving accounts by id, you could use a Map instead of a list. The truth is that to support all retrieval methods, you would need a relational database of some kind. If you are looking for a naive solution, keep the ArrayList and iterate through all members to find the ones you are looking for.

kgiannakakis
i do not understand returning a student object, i am pretty new on the topic polymorphism , my idea is to login the person based on his created account and he will be directed to a GUI that will display his information.
kyrogue
+1  A: 

It looks good so far. One thing that you could do is to move the ID (staffID and studentID) up to the Account class, calling it something like accountID. It seems that all accounts that you create need an ID, so moving this up makes sense.

One benefit of this would be to simplify your DataStorage class by having a single Collection. Even if you would like to keep your Staff and Students separate, you could also use Map instead of a List in DataStorage, as this would make lookups faster and easier.

akf
hi i have not yet learned about what is Collection or a Map , that is why i have used arrayList.
kyrogue
an ArrayList is a sort of collection, and it implements the `List` interface. `Map` also falls within the collections framework, and a benefit with `Map` is that you can store objects with a lookup key. In your case here, the key could be the `accountID`.
akf
thanks,i just read about it and it seems that the key must be Unique, does this mean when i am putting in values there will be put(staffMembers,"John") and the next thing that will be put will be put(staff2Members2,"Tim")? because the key must be unique
kyrogue
I would use the ID as the key: `put(account.getID(), account)`. That way you could easily access a `Student` or a `Staff` object by passing in the ID of the account in question.
akf
A: 

thanks to the answers i have come up with a new DataStorage class with HashMap object, note that i have not full grasp how HashMap works and this is what i have partially done, and would like to ask am i going in the right direction? A creation of a test class works, i am able to get the a value.

import java.util.*;

public class DataStorage 
{
    HashMap<String, Student> students = new HashMap<String, Student>();  
    HashMap<String, Staff> staffMembers = new HashMap<String, Staff>();  
    //Default constructor
    public DataStorage(){
    }

    public void addStaffMember(Staff aAcc) 
    {
     staffMembers.put(aAcc.getAccID(),aAcc);
    }

    public void addStudentMember(Student aAcc)
    {
     students.put(aAcc.getAccID(),aAcc);
    }

   public Staff getStaffMember(Staff aAcc)
   {
   return   staffMembers.get(aAcc.getAccID());
   }

}

/* test*/

public class Test {


    public static void main(String[] args) {
        DataStorage ds = new DataStorage();
        String name = "John";
        String ID = "0900477A";
        String Department = "ENG";
        String username = "ky";
        String pass = "ky";

        Staff sf2 = new Staff("Tim","Tim","Tim","Tim","Tim");
       Staff sf = new Staff(name, ID, Department, username, pass);
       ds.addStaffMember(sf2);
       ds.addStaffMember(sf);
      Staff temp = ds.getStaffMember(sf2);

       System.out.println(temp.getName());
    }
}
kyrogue
TIP: Do not use capitals as field names / variable names. The are by convention reserved for class / interface / enum definition (here 'ID' and 'Department' violate that rule).TIP: Start using Unit-tests for testing classes http://testng.org/ http://junit.org/ .
Verhagen
A: 

Here some test class, as it would have been written with JUnit.

// Tests related to the Staff class
public class StaffTest {

    // This test should be successful, as all argument are correct
    @Test
    public void testCreateStaffMember() {
        String name = "John";
        String staffId = "0900477A";
        String department = "ENG";
        String username = "john";
        String password = "secret";
        new Staff(name, staffId, department, username, password);
    }

    // This test should throw an IllegalArgumentException, as the name is required.
    @Test(expected=IllegalArgumentException.class)
    public void testCreateStaffMemberNameNull() {
        String name = null;
        String staffId = "0900477A";
        String department = "ENG";
        String username = "john";
        String password = "secret";
        new Staff(name, staffId, department, username, password);
    }

    // This test should throw an IllegalArgumentException, as the name is required.
    @Test(expected=IllegalArgumentException.class)
    public void testCreateStaffMemberNameEmpty() {
        String name = "";
        String staffId = "0900477A";
        String department = "ENG";
        String username = "john";
        String password = "secret";
        new Staff(name, staffId, department, username, password);
    }

    // More constructor test follow


    // This test should be successful, as all getters, should return the given input values.
    @Test
    public void testValidateGetterMethods() {
        String name = "";
        String staffId = "0900477A";
        String department = "ENG";
        String username = "john";
        String password = "secret";
        Staff staff = new Staff(name, staffId, department, username, password);
        Asset.assertEquals(name, staff.getName());
        Asset.assertEquals(staffId, staff.getStaffId());
        Asset.assertEquals(department, staff.getDepartment());
        Asset.assertEquals(username, staff.getUsername());
        Asset.assertEquals(password, staff.getPassword());
    }

    // More tests...
}
// Tests related to the DataStorage class
public class DataStorageTest {

    @Test
    public void testAddStaffMembers() {
        DataStorage ds = new DataStorage();
        ds.addStaff(createJohn());
        ds.addStaff(createAlan());
    }

    // Here you deside, as the designer off the application, what should happen!
    // Will the second John, override the first John? As they have the same ID? 
    // Or will an exception be thrown, because the staff member with that id 
    // already exists?
    @Test
    public void testAddStaffMembersSameName() {
        DataStorage ds = new DataStorage();
        ds.addStaff(createJohn());
        ds.addStaff(createJohn());
    }

    Staff createJohn() {
        String name = "John";
        String staffId = "0900477A";
        String department = "ENG";
        String username = "john";
        String password = "secret";
        return new Staff(name, staffId, department, username, password);
    }

    Staff createAlan() {
        ...
    }
}
Verhagen