Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

job4-internal-classes / Курс Основы Java-Задание 4-Классы ч2

.rtf
Скачиваний:
25
Добавлен:
18.03.2015
Размер:
125.62 Кб
Скачать

Курс Основы Java 6

Задание №4. Классы/ч2. Вложенные классы.

  1. Пример использования внутренних классов

см также проект lesson7_internals и lec_08_p3_interface.pptx.

Здесь приведём листинг программы для демонстрации особенностей работы с вложенными классами.

Файл Controller.java: некоторый контроллер

package lesson7;

/**

* Пример класса Controller с внутренними публичными классами (Abc и ControllerManager).

*/

public class Controller {

/** Менеджер данного контроллера */

private ControllerManager localManager;

private final String tag;

/**

* @param atag название контроллера

*/

public Controller(String atag) {

// this.localManager = new CtrlManager();

this.tag = atag;

}

/**

* Информационный метод

* @return тег данного контроллера

*/

public String getTag() {

return this.tag;

}

@Override

public String toString() {

return String.format( "(%s) tag = %s", this.getClass(), this.tag);

}

/**

* Демонстрация публичного вложенного класса.

*/

public static class Abc {

}

/**

* ControllerManager внутренний класс: нестатический публичный.

* Т.к. класс ControllerManager не статический, то каждый его экземпляр

* будет привязан к своему эземпляру Controller.

* При этом, java не ограничивает количество экземпляров типа

* ControllerManager, привязанных к одному и тому же экземпляру Controller.

* Такое ограничение можно наложить логикой работы. Здесь для этого сделано

* следующее:

* 1) конструктор ControllerManager сделан private, чтобы извне было

* невозможно создавать объекты типа ControllerManager,

* 2) имеется единственный публичный метод Controller.getManager, который

* возвращает объекты класса ControllerManager, и в этом методе мы используем

* приватное поле для хранения одного экземпляра менеджера для каждого контроллера.

*/

public class ControllerManager {

private ControllerManager() {

}

public String getInfo() {

// получение тега от контроллера, который является основнм для данного менеджера

return tag; // более конкретно можно так: return Controller.this.tag;

}

}

/**

* Метод получения менеджера данного контроллера.

* @return менеджер данного контроллера.

*/

public ControllerManager getManager() {

if (this.localManager == null)

this.localManager = new ControllerManager();

return this.localManager;

}

}

Файл Lesson7DemoInternal.java: минипрограмма проверки работы Controller.java

package lesson7;

import java.util.logging.Level;

import java.util.logging.Logger;

public class Lesson7DemoInternal {

public static void main(String[] args) {

try {

// пример создания внутреннего класса Abc из класса Controller

Controller.Abc x;

x = new Controller.Abc();

// Демонстрация связки котроллера и менеджера

final Controller ctrl = new Controller("MyControl");

System.out.println("ctrl.toString()="+ ctrl.toString());

System.out.println("ctrl.getManager().getInfo()="+ ctrl.getManager().getInfo());

// менеджер контроллера

Controller.ControllerManager mgr;

mgr = ctrl.getManager(); // вызов getManager единственный способ получить инициализированный объект класса ControllerManager

// mgr = ctrl.new CtrlManager(); // (!) у ControllManager конструктор приватный и создание здесь невозможно

// MatrixUtils utils = new MatrixUtils(); // (!) у MatrixUtils конструктор приватный и создание здесь невозможно

} catch (Exception ex) {

Logger.getLogger(Lesson7DemoInternal.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

Пример консольный работы

ctrl.toString()=(class lesson7.Controller) tag = MyControl

ctrl.getManager().getInfo()=MyControl

  1. Задание №4

Вынести в отдельный пакет tools и реализовать в класс MatrixUtils следующие методы, использованные в ЛР №3:

  • static int[] readVector(InputStream stm, int size, CheckComment isComment) для чтения вектора чисел из потока здесь stm входной поток с данными (может иметь более подходящий тип, например, BufferedReader ), size кол-во элементов в векторе, isComment это интерфейс проверки является ли строка комментарием. Интерфейс имеет вид: interface CheckComment { boolean isComment(String data); }

  • static int[][] readMatrix(InputStreamstm, introws, intcols, CheckComment isComment) для чтения матрицы из потока здесь stm входной поток с данными, rows, cols кол-во срок и столбцов матрицы,

  • static StringBuilder getPrintViewVector(int[] vector) для формирования текстового дампа для вектора – числа в одну строку

  • static StringBuilder getPrintViewMatrix(int[][] matrix) дляформированиядампа матрицы по строкам.

Выполнить лабораторную работу №2 с использованием функций нового пакета.

Все методы главного класса, кроме main, сделать НЕ статическими.

Интерфейс CheckComment реализовать внутренним классом.

Примерная структура кода:

Файл “main”:

import tools.MatrixUtils;

finalpublic class Job04 {

public static final void main(String[] args) {

final Lab04 lab = new Lab04();

lab.loadData(…);

lab.saveData(…)

}

// (!) не статический метод чтения данных

void loadData( … ) {

}

// (!) не статический метод сохранения данных

void saveData( … ) {

}

}

Файл Utils.java в пакете tools:

package tools;

import …;

final public class Utils{

// здесь методы, естественно, остаются статическими

public static StringBuilder getPrintViewVector(…) {…}

public static StringBuilder getPrintViewMatrix(…) {…}

public static int[] readVector(…) {…}

… другие методы …

}

[конец]