2017-05-17 3 views
0

ich eine Variable public static List<Integer> allBooksIDs haben, die global definiert und in einem Konstruktor initialisiert als allBooksIDs = dbFunctions.getAllBookIDs();Größe der globalen Variablen unterscheidet sich von Größe der Rückgabeliste

Das Problem ist, dass, wenn ich überprüfen Sie die Größe der Liste allBooks, die Wert ist 28, aber wenn ich überprüfe die Größe der Liste von dbFunctions.getAllBookIDs() Methode zurückgegeben - es ist 57. Gibt es irgendetwas, was ich falsch mache?

getAllBookIDs()

public List<Integer> getAllBookIDs(){ 
    List<Book> allBooks = getAllBooks(); 
    List<Integer> res = new ArrayList<>(); 
    for (Book b : allBooks){ 
     res.add(b.getId()); 

    } 
    return res; 
} 

    private List<Book> getAllBooks() { 
    Query query = manager.createQuery("from books"); 
    return query.getResultList(); 
} 

UPDATE

das Problem also gelöst, aber ich habe nicht verstanden, warum die Variable wurde aktualisiert wird. Ich hatte ein Mathod, das die Werte der globalen Variablen einer anderen Variablen List<Integer> nonRatedBooks = allBooksIDs zuordnete, und danach wurde die Variable aktualisiert. Ich habe gerade gechickt:

List<Integer> nonRatedPubs = new ArrayList<>(); 
nonRatedPubs.addAll(allBooksIDs); 

Kann mir jemand erklären, warum es so war? Damit ich in Zukunft nicht den gleichen Fehler mache.

+2

Wie überprüfen Sie die Größe? Ich sehe nicht, wie das möglich ist, basierend auf dem tatsächlichen Code, den Sie uns oben gezeigt haben. –

+0

"Ich habe eine Variable' öffentliche statische Liste allBooks' ". Das ist eine schlechte Idee. Davon abgesehen müssen Sie weitere Informationen zur Belegung der Listen bereitstellen. – bradimus

+1

'allBooks' scheint nicht global in Ihrem Code definiert zu sein – JCoder

Antwort

4

Sie haben eine Variable innerhalb getAllBookIDs() die allBooks benannt ist, so der List, dass diese Methode zurückgibt, die intern allBooks definiert wird, nicht die global definiert allBooks Objekt.

+1

Maskierung von Variablennamen scheint plausibel +1 –

+0

Der Name der statischen Variable ist unterschiedlich. Mein Fehler. Habe den Beitrag bearbeitet. – Cap

0

Es ist eine Kombination aus Maskierung und Initialisierung der Variablen allBooks. Der erste Schritt ist, dass Sie allBooks im Konstruktor mit

constructor{ 
    allBooks = dbFunctions.getAllBookIDs(); // returns a list 
} 

An diesem Punkt initialisiert wird, es ist die richtige Größe, aber später, wenn Sie mehr Book ‚s hinzufügen Sie sind nicht mehr das statische allBooks Feld zu aktualisieren und das ist, weil Maskieren des Variablennamens innerhalb der getAllBookIDs Methode.

public List<Integer> getAllBookIDs(){ 
    List<Book> allBooks = getAllBooks(); // this is a local field with the exact name as the static field and thus it will not assign it to the static field. 
} 
+0

Der Name der statischen Variable ist unterschiedlich. Mein Fehler. Habe den Beitrag bearbeitet. – Cap

+0

@Cap Dann ist meine erste Aussage wahrscheinlich die, die Sie suchen. Jedes Mal, wenn Sie 'getAllBookIDs' aufrufen, gibt es eine neue' ArrayList' zurück und wird daher nicht in das statische Feld übernommen, es sei denn, Sie weisen es ihm zu. –

+0

Das Problem ist, ich gebe nur Werte zu dieser Variable. Andere Methoden verwenden es nur. – Cap

Verwandte Themen