jab4-answer / Курс Основы Java-Задание 4-Классы ч2
.rtf
Курс
Основы Java
Задание №4. Классы/ч2. Вложенные классы.
-
Пример использования внутренних классов
см также проект 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 |
-
Задание №4
Вынести в отдельный пакет tools и реализовать в класс MatrixUtils следующие методы, использованные в ЛР №2:
-
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 реализовать внутренним классом.
(*) Дополнительное задание: реализовать с минимальными изменениями:
1) Комментарии в конце строки: если в строке встречается пара символов "//", то начало строки до этих символов - данные, после них - комментарий.
2) Частичные комментарии внтутри строк, когда данные и комментарий могут перемежаться, вида :
{ коментарий внутри фигурных скобок }
(*коментарий внутри круглых скобок *)
/*коментарий внутри косых скобок */
3) Комментарии из п 2 могут быть многострочные, т.е. начинаться на одной строке а заканчиваться в другой (в любом её месте).
(!) Учесть, что в любой строке могу встречаться совместно разные виды комментариев, причём неоднократно.
Например:
25 { комментарий 1 } -3 4 (* комментарий 2*) 32 // комментарий до конца строки.
Примерная структура кода:
Файл “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(…) {…}
… другие методы …
}
[конец]