Главная » Java » Возвращаемся к массивам

0

В главе 9 программа ScoreWriter  создавала массив объектов String и сохраняла имена и очки игроков в файл.  Настало время узнать,  как использовать массивы для хранения любых объектов.В этот раз  для представления счета в игре мы  создадим объект.  Этот объект  будет  содержать  такие  атрибуты,  как  имя  и  фамилия  игрока, счет и последнюю дату игры.Ниже представлен класс Score.  Он содержит специальные методы  для чтения  (getter) и записи (setter) каждого из  своего атрибутов, который объявлен   с   модификатором   доступа   private.  Наверное,  может показаться  неочевидным,  почему  вызывающий  класс  просто  не устанавливает значение атрибута напрямую, например, так:Score.score = 250;

Вместо  этого он это делает так:

Score.setScore(250);

А что, если позже мы решим, что наша программа должна проигрывать мелодию тогда, когда игрок достигает счета в 500 очков? Если в классе Score есть метод setScore(),  все  что нужно сделать, это изменить только  этот метод. Нужно добавить в него код, который проверяет количество очков и при необходимости проигрывает мелодию. Вызывающий  класс продолжит вызывать музыкальную версию методаsetScore() точно таким же образом. Если вызывающий класс будет устанавливать счет напрямую, то все «музыкальные» изменения нужно будет   реализовать в вызывающем классе. А  если потребуется использовать   класс в двух разных игровых программах? В случае прямого изменения значений атрибутов потребуется реализовать эти изменения в двух вызывающих классах. Но, если бы у вас был setter-­? метод, то изменения были бы инкапсулированы в нем  и вызывающие классы менять не нужно было бы.import java.util.Date;

public class Score {

private String firstName; private String lastName; private int score;

private Date playDate;

public String getFirstName(){

return firstName;

}

public void setFirstName(String firstName){

this.firstName = firstName;

}

public String getLastName(){

return lastName;

}

public void setLastName(String lastName){

this.lastName = lastName;

}

public int getScore(){

return score;

}

public void setScore(int score){

this.score=score;

}

public Date getPlayDate(){

return playDate;

}

public void setPlayDate(Date playDate){

this.playDate=playDate;

}

// Объединяем все атрибуты в строку (String)

// и в конце добавляем символ перевода на новую строку.

// Этот метод удобно использовать, если вызывающий класс

// хочет за один раз распечатать все значения, например

// System.out.println(myScore.toString());

public String toString(){

String scoreString = firstName + " " +

lastName + " " +  score + " " + playDate + System.getProperty("line.separator");

return scoreString;

}

}

Программа ScoreWriter2 создаст экземпляры объекта Score и назначит значения  атрибутам этих экземпляров.import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; import java.util.Date;

public class ScoreWriter2 {

/** Метод main выполняет следующие действия:

1. Создает экземпляр массива

2. Создает объекты Score и заполняет ими массив

3. Записывает счет игры в файл

*/

public static void main(String[] args) { FileWriter myFile = null;

BufferedWriter buff = null;

Date today = new Date();

Score scores[] = new Score[3];

// The player #1 scores[0]=new Score(); scores[0].setFirstName("Николай"); scores[0].setLastName("Смирнов"); scores[0].setScore(250); scores[0].setPlayDate(today);

// The player #2 scores[1]=new Score(); scores[1].setFirstName("Анна"); scores[1].setLastName("Егорова"); scores[1].setScore(300); scores[1].setPlayDate(today);

// The player #3 scores[2]=new Score();

scores[2].setFirstName("Сергей");

scores[2].setLastName("Данилов"); scores[2].setScore(190); scores[2].setPlayDate(today);

try {

myFile = new FileWriter("c:\\scores2.txt");

buff = new BufferedWriter(myFile);

for (int i=0; i < scores.length; i++) {

// Преобразует каждый счет в объект String

// и записывает его в scores2.txt buff.write(scores[i].toString()); System.out.println("Запись  " +

scores[i].getLastName() );

}

System.out.println("Запись файла завершена");

}catch (IOException e){

e.printStackTrace();

} finally {

try{

buff.flush(); buff.close(); myFile.close();

}catch(IOException e1){

e1.printStackTrace();

}

}

}

}

Если  программа  пытается  обратиться  к элементу  массива,  который находится  за  его  границами,

Источник: Java  Programming for Kids, Parents and Grandparents by Yakov Fain

По теме:

  • Комментарии