У меня возникла проблема с изменением значений переменной класса внутри вложенных циклов - я не могу понять, почему. Я предполагаю, что это потому, что переменная static. Но это статический метод, и поскольку он используется для перечисления пользователя в системе из файла, он должен быть статичным (я вызываю его из основного метода для чтения файла в TreeMaps). Невозможно ли переписать статическую переменную класса из метода? Если это возможно - что, черт возьми, я делаю неправильно?Изменение значений статических переменных класса во вложенном цикле
public class Loan{
protected int noOfLoans;
protected int noOfReturns;
protected User user=new User();
protected static Book book= new Book();
protected Map <Integer, Book> currentLoans=new TreeMap <Integer, Book>();
protected Map <Integer, Book> returned=new TreeMap <Integer, Book>();
protected static Map<Integer, Loan> loanList=new TreeMap<Integer, Loan>();
public static void main(String[] args){
readLoans();
}
public static void readLoans(){
loanList.clear();
BufferedReader reader = null;
try {
reader=new BufferedReader(new FileReader("loans.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
String line = null;
try {
line = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
while (line!=null) {
String[] splitOut=line.split("-");
String[] loan_User=splitOut[0].split(",");
String[] loan_CurrentLoans=splitOut[2].split(",");
String[] loan_Returned=splitOut[4].split(",");
Loan loan = new Loan();
loan.user.setFirstName(loan_User[0]);
loan.user.setSurname(loan_User[1]);
loan.user.setPersonalID(loan_User[2]);
for (int i = 1; i <= Integer.parseInt(splitOut[1]); i++) {
book.setName(loan_CurrentLoans[((Integer.parseInt
(splitOut[1])-1)*4)]);
book.setAuthorFirstname(loan_CurrentLoans[((Integer.parseInt
(splitOut[1])-1)*4)+1]);
book.setAuthorSurname(loan_CurrentLoans[((Integer.parseInt
(splitOut[1])-1)*4)+2]);
book.setISBN(loan_CurrentLoans[((Integer.parseInt
(splitOut[1])-1)*4)+3]);
loan.currentLoans.put(i, book);
}
for (int i = 1; i <= Integer.parseInt(splitOut[3]); i++) {
book.setName(loan_Returned[((Integer.parseInt
(splitOut[3])-1)*4)]);
book.setAuthorFirstname(loan_Returned[((Integer.parseInt
(splitOut[3])-1)*4)+1]);
book.setAuthorSurname(loan_Returned[((Integer.parseInt
(splitOut[3])-1)*4)+2]);
book.setISBN(loan_Returned[((Integer.parseInt
(splitOut[3])-1)*4)+3]);
loan.returned.put(i, book);
}
loan.setNoOfLoans(Integer.parseInt(splitOut[1]));
loan.setNoOfReturns(Integer.parseInt(splitOut[3]));
loanList.put(loanList.size()+1, loan);
try {
line=reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Вот линейный вход для справки:
John,Doe,8-2-a book,Author,Authorson,1234567890123,another book,Author,Authorson,23456789-1-a returned book,Author,Authorson,3456789
Что я в надежде получить при печати выше линии:
Current Loans:
1. a book by Author Authorson (1234567890123)
2. another book by Author Authorson (23456789)
Returned Loans:
1. a returned book by Author Authorson (3456789)
Что я в настоящее время получать:
Current Loans:
1. a book by Author Authorson (1234567890123)
2. a book by Author Authorson (1234567890123)
Returned Loans:
1. a book by Author Authorson (1234567890123)
И
readLoans();
System.out.println(loanList.get(2).currentLoans.get(1).toString());
System.out.println(loanList.get(2).currentLoans.get(2).toString());
возвращает
a returned book by Author Authorson (3456789)
a returned book by Author Authorson (3456789)
Который ведет меня поверить, что я на самом деле не могу сделать экземпляры моего статического объекта книги, но должен сделать это не статическим и пытаться создавать экземпляры объекта в методе , Если да - как это сделать?
Вы пытались отлаживать свой код и действительно видеть, что происходит в пошаговом застое? –
Конечно, вы ** не можете ** создавать * экземпляры * статических объектов, вот в чем разница между статическими и нестационарными. Статический объект принадлежит самому классу. –