Тема: Абстрактний клас чи можна щось краще?
Відразу вибачаюсь, за назву теми, не знаю, як краще назвати.
Проблема така: В програмі є два дерева (JTree) також є два вузли (TreeNode). Для кожного вузла пишу клас, який наслідується від DefaultMutableTreeNode. Вся різниця між класами: 1. Різні дані (різні запити до БД) 2. Кількість вузілв в головноних вузлах різна ("вузол"-"вузол"-"вузол"-"листок" інший "вузол"-"вузол"-"листок") . Тобто класи майже ідентичні, не бачу сенсу мати два класи, тому все, що приходить на розум це створення абстрактного класу MyNode з визначиними методами і тільки один метод буде абстрактним setData(). Підкажіть, як бути чи створювати абстрактний клас чи є кращий вихід?
class ObjectNode
package tree;
import main.ConnectWork;
import dialog.ExceptionDialog;
import javax.swing.tree.DefaultMutableTreeNode;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Клас для створення вузла дерева (район-тип об'єкта-адреса об'єкта)
*
*/
public class ObjectNode extends DefaultMutableTreeNode {
/**
* Створює вузол дерева з ім'ям
*
* @param name
* ім'я головного вузла
* */
public ObjectNode(String name) {
super(name);
setData();
}
/**
* Метод заповняє вузол даними
* */
private void setData() {
loadArea();
for (int i = 0; i < getChildCount(); i++) {
DefaultMutableTreeNode area = (DefaultMutableTreeNode) getChildAt(i);
loadType(area);
for (int j = 0; j < area.getChildCount(); j++) {
loadAdreess(area, (DefaultMutableTreeNode) area.getChildAt(j));
}
}
}
/**
* Метод додає вузли до головного вузла
* */
private void loadArea() {
String procedure = "CALL all_region ();";
try (CallableStatement statement = ConnectWork.connect
.prepareCall(procedure);) {
ResultSet result = statement.executeQuery();
while (result.next()) {
add(new DefaultMutableTreeNode(result.getString(1)));
}
} catch (SQLException e) {
new ExceptionDialog(ConnectWork.frame == null ? null
: ConnectWork.frame, null, e);
}
}
/**
* Метод додає вузли до вузла
*
* @param area
* вузол до якого додають вузли
* */
private void loadType(DefaultMutableTreeNode area) {
String procedure = "CALL all_type_object_in_region (?)";
try (CallableStatement statement = ConnectWork.connect
.prepareCall(procedure);) {
statement.setString(1, area.toString());
ResultSet result = statement.executeQuery();
while (result.next()) {
area.add(new DefaultMutableTreeNode(result.getString(1)));
}
} catch (SQLException e) {
new ExceptionDialog(ConnectWork.frame == null ? null
: ConnectWork.frame, null, e);
}
}
/**
* Метод додає листки до вузла
*
* @param area
* вузол
* @param type
* вузол до якого додають листки
* */
private void loadAdreess(DefaultMutableTreeNode area,
DefaultMutableTreeNode type) {
String procedure = "CALL all_address_in_region_and_type (?, ?)";
try (CallableStatement statement = ConnectWork.connect
.prepareCall(procedure);) {
statement.setString(1, area.toString());
statement.setString(2, type.toString());
ResultSet result = statement.executeQuery();
while (result.next()) {
type.add(new DefaultMutableTreeNode(result.getString(1)));
}
} catch (SQLException e) {
new ExceptionDialog(ConnectWork.frame == null ? null
: ConnectWork.frame, null, e);
}
}
/**
* Метод перезавантажує (поновлює) вузол
* */
public void reload() {
removeAllChildren();
setData();
}
}
class MotorNode
package tree;
import main.ConnectWork;
import dialog.ExceptionDialog;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Клас для створення вузла дерева (серія двигуна-тип двигуна)
*
*/
public class MotorNode extends DefaultMutableTreeNode {
/**
* Створює вузол дерева з ім'ям
*
* @param name
* ім'я головного вузла
* */
public MotorNode(String name) {
super(name);
setData();
}
/** Метод заповняє вузол даними */
private void setData() {
loadSeries();
for (int i = 0; i < getChildCount(); i++) {
DefaultMutableTreeNode series = (DefaultMutableTreeNode) getChildAt(i);
loadType(series);
}
}
/**
* Метод додає вузли до головного вузла
* */
private void loadSeries() {
String procedure = "CALL all_series_motor ();";
try (CallableStatement statement = ConnectWork.connect
.prepareCall(procedure);) {
ResultSet result = statement.executeQuery();
while (result.next()) {
add(new DefaultMutableTreeNode(result.getString(1)));
}
} catch (SQLException e) {
new ExceptionDialog(ConnectWork.frame == null ? null
: ConnectWork.frame, null, e);
}
}
/**
* Метод додає листки до вузла
*
* @param series
* вузол до якого додають листки
* */
private void loadType(DefaultMutableTreeNode series) {
String procedure = "CALL all_type_motor_in_series (?)";
try (CallableStatement statement = ConnectWork.connect
.prepareCall(procedure);) {
statement.setString(1, series.toString());
ResultSet result = statement.executeQuery();
while (result.next()) {
series.add(new DefaultMutableTreeNode(result.getString(1)));
}
} catch (SQLException e) {
new ExceptionDialog(ConnectWork.frame == null ? null
: ConnectWork.frame, null, e);
}
}
/**
* Метод перезавантажує (поновлює) вузол
* */
public void reload() {
removeAllChildren();
setData();
}
/**
* Метод повертає шлях до вказаного двигуна
*
* @param series
* серія двигуна
* @param type
* тип двигуна
* @return шлях до двигуна об'єкт класа TreePath
* */
public TreePath getPathToMotor(Object series, Object type) {
DefaultMutableTreeNode nodeSeries = null;
for (int i = 0; i < getChildCount(); i++) {
nodeSeries = (DefaultMutableTreeNode) getChildAt(i);
if (nodeSeries.toString().equals(series)) {
break;
}
}
DefaultMutableTreeNode nodeType = null;
for (int i = 0; i < nodeSeries.getChildCount(); i++) {
nodeType = (DefaultMutableTreeNode) nodeSeries.getChildAt(i);
if (nodeType.toString().equals(type)) {
break;
}
}
Object[] arr = new Object[] { getRoot(), nodeSeries, nodeType };
return new TreePath(arr);
}
}