A continuación se puede ver la repetición pasando en mi DataCsvLoader.
Tengo un método getCsvAsMap que tampoco está en uso. Todo el T son rojos porque, obviamente, si bien podría estar recibiendo una no sabe mapa ... compilador cómo conseguir que T Tipo de allí ... ¿Hay una manera de pasarlo?
Es la única manera de crear otra clase como un controlador .. específicamente para el método getCsvAsMap?
Sincrerely, Tricky4me
DataCsvLoader:
//
// Read and cache CSVs
//
public Map<Integer, CourseEntity> getAllCourses() {
String csvPath = "courses.csv";
// Create a new course Map with the right Entity type
Map<Integer, CourseEntity> entityMap = new HashMap<>();
repositoryInMem.put(csvPath, entityMap);
// Get data from CSV
EntityLoader<CourseEntity> entityLoader = new EntityLoader<>();
entityMap = entityLoader.readCsv(csvPath);
return entityMap;
}
public Map<Integer, StudentEntity> getAllStudents() {
String csvPath = "students.csv";
// Create a new course Map with the right Entity type
Map<Integer, StudentEntity> entityMap = new HashMap<>();
repositoryInMem.put(csvPath, entityMap);
// Get data from CSV
EntityLoader<StudentEntity> entityLoader = new EntityLoader<>();
entityMap = entityLoader.readCsv(csvPath);
return entityMap;
}
public Map<Integer, TestEntity> getAllTests() {
String csvPath = "tests.csv";
// Create a new course Map with the right Entity type
Map<Integer, TestEntity> entityMap = new HashMap<>();
repositoryInMem.put(csvPath, entityMap);
// Get data from CSV
EntityLoader<TestEntity> entityLoader = new EntityLoader<>();
entityMap = entityLoader.readCsv(csvPath);
return entityMap;
}
public Map<Integer, MarkEntity> getAllMarks() {
String csvPath = "marks.csv";
// Create a new course Map with the right Entity type
Map<Integer, MarkEntity> entityMap = new HashMap<>();
repositoryInMem.put(csvPath, entityMap);
// Get data from CSV
EntityLoader<MarkEntity> entityLoader = new EntityLoader<>();
entityMap = entityLoader.readCsv(csvPath);
return entityMap;
}
public Map<Integer, T> getCsvAsMap(String fileName, Map<Integer, T> entityMap){
// Add the Entity map to the repository in Mem
// The key to each entity map is just it's filename
repositoryInMem.put(fileName, entityMap);
// Get data from CSV
EntityLoader<T> entityLoader = new EntityLoader<T>();
entityMap = entityLoader.readCsv(fileName);
return entityMap;
}
EntityLoader:
public class EntityLoader<T> {
public Map<Integer, T> readCsv(String csvFile){
Map<Integer, T> table = new HashMap<>(); // Fits entire CSV table
int rowCount=0;
try {
String row;
BufferedReader csvReader = new BufferedReader(new FileReader(csvFile));
while ((row = csvReader.readLine()) != null) {
String[] data = row.split(",");
table.put(rowCount++, Arrays.asList(data));
}
csvReader.close();
}catch (FileNotFoundException e){
System.err.println("No file with name " + csvFile +
"Are the CSV files in the root folder? Ex: ReportCard\\courses.csv");
}catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
Parece que no están haciendo las cosas de manera orientada a objetos. Las clases que tiene propiedades similares deben utilizar la abstracción.
Seguir los pasos dados para resolver el problema.
- Crear una interfaz
IEntity
y aplicar el mismo en todas las entidades. Por ejemplo,MarkEntity
se puede definir como
public class MarkEntity implements IEntity {
// class implementation
}
- Cambiar la
getCsvAsMap()
con la siguiente
public Map<Integer, IEntity> getCsvAsMap(String fileName, Map<Integer, IEntity> entityMap){
}
- Cambiar la
EntityLoader
clase de
public class EntityLoader<T extends IEntity> {
// Class implementation
}
Eso debería hacer.
Editar
Si la abstracción no es posible, ya que las entidades no comparten ningún elemento o si la getCsvMap()
debe devolver el mismo tipo de retorno como el segundo argumento, entonces la siguiente sustitución debería funcionar bien.
public <T> Map<Integer, T> getCsvAsMap(String fileName, Map<Integer, T> entityMap)