Zmienna klasowa, a wiele plików

0

Napotkałem się z problemem, na który nie wiem co zdziałać.

W klasie chcę, aby każdy obiekt miał swoje id.
W tym celu stworzyłem zmienną klasową:

static int zmienna_klasowa=1;

W konstruktorze, każdy obiekt dostaje id = zmienna_klasowa, następnie zmienna_klasowa jest inkrementowana, aby kolejny obiekt dostał kolejną liczbę.

Do tego mam dwie metody void:

	static public void poprawID2()
	{
		zmienna_klasowa=zmienna_klasowa-1;
	}
	
	
	public void poprawID(int a)
	{

		if(this.id>a)
		{
			this.id--;
		}
	}

Pierwsza metoda przy usuwaniu któregoś z obiektów, zmniejsza o 1 zmienną_klasową. Druga poprawia ID obiektów, które miały ID większe niż usunięty obiekt, aby wszystkie ID były po kolei i nie było luk, typu: [1, 2, 3, 6, 7, 9]. Parametr int a - jest indeksem usuniętego obiektu.

No i wszystko okey, działało to, jednak gdy wprowadziłem w moim programie możliwość, korzystania z kilku plików, na których są różne listy ArrayList z elementami mojej klasy, wtedy cała koncepcja runęła, bo wszystkie listy, korzystają z tej samej zmiennej_klasowej, przez co przykładowo, jeśli lista nr1. ma 20 obiektów, a lista nr.2 tylko 4 obiekty, to gdy dodam do niej nowy obiekt, to ma id=21, a nie 5. Zapewne rozumiecie o co chodzi.

Jest mi ktoś w stanie powiedzieć, jak to naprawić?

Z góry dzięki.

0

Dlaczego chcesz, aby każdy obiekt miał swoje id?
To brzmi jak klasyczny problem XY.

0

Robię taką mała aplikację typu biblioteka/wypożyczalnia, z GUI w swingu, no i chciałem, żeby każda pozycja na liście miała swoje ID.

0

Wywal ta statyczna zmienna i dodaj nowa klase z prywatna kolekcja tych twoich obiektow i metodami do zarzadzania nimi.

2

Problem polega na tym, że w tej klasie chcesz przechowywać informacje, które nie są z nią związane. Numery wierszy są związane z GUI, a nie z danymi. Zatem to w kodzie, który wyświetla listę powinieneś nadawać kolejne numery. Takie rozwiązanie jest najprostsze. Trochę bardziej złożonym rozwiązaniem jest wprowadzenie klasy, która będzie łączyć model danych ze sposobem jego wyświetlania:

public class BookPresenter{

	private Collection<Book> books;

	public BookPresenter(Collection<Book> books){
		this.books = new ArrayList(books); // płytka kopia kolekcji, by zmiany w oryginalnej nie wpływały na tą z widoku
	}

	public void render(View<Collection<Book>> view){
		view.accept(books);
	}
}

Trzeba w tym przypadku stworzyć interfejs View:

public interface View<T>{

	void accept(T t);

}

i jego przykładowa implementacja w oparciu o JList:

public class BookList extends JList implements View<Collection<Book>>{

	public BookList(){
		super(new DefaultListModel());
	}

	public void accept(Collection<Book> books){
		AtomicInteger counter = new AtomicInteger(1);
		books.forEach( book -> ((DefaultListModel)getModel()).addElement(counter.getAndIncrement() + ". " + book.getTitle()));
	}
}

W efekcie otrzymasz listę książek ponumerowana od jedynki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1