Skocz do zawartości
aurel

[java] Arraylist

Rekomendowane odpowiedzi

muszę napisać piłeczkę do arkanoida

no i mam problem z rozgryzieniem jednej rzeczy

mianowicie obsługi ArrayList

 

moja piłeczka musi sprawdzic ze kolizję ze wszystkimi obiektami po kolei (poza innymi piłeczkami)

inne obiekty są zapisane jako

 

private List<SimpleObject> objects;

aby się do nich odwołać używam:

 

public List<SimpleObject> getobjectlist()	{		return objects;	}

SimpleObject wygląda tak:

public class SimpleObject {	static int OBJECT_NONE = 0;		protected drect position;	protected int speed;	protected int tickcount;		public SimpleObject (drect pos, int objectspeed)	{		position = pos;		speed = objectspeed < 1 ? 1 : objectspeed;		tickcount = 0;	}		public int identifyobject() {		return OBJECT_NONE;	}		public drect GetPosition()	{		return position;	}		public void SetSpeed(int newspeed)	{		speed = newspeed;	}		public int IncSpeed(int steep)	{		if ((speed -= steep) < 1)			speed = 1;		return (speed);	}		public int DecSpeed(int steep)	{		return (speed += steep);	}			public void TimerTick()	{		if (++tickcount < speed)		{			return;		}		tickcount = tickcount % speed;		this.Action();	}		protected void Action()	{		System.out.println("Object "+position.GetX()+" action");	}}

i zastanawiam się jak się własciwie z tego korzysta...

potrzebuje od kazdego obiektu wziac identifyobject i GetPosition

i w mojej glowie wygladalo by to mniej wiecej tak:

getobjectList()for (i=0; i<ilosc obiektow; i++){	   nazwa=objects[i].identifyobject;	   x=objects[i].getposition.position.x;	   y=objects[i].getposition.position.y;}

tyle ze jak widać, więcej w tym pseudokodu niż czegokolwiek innego, bo ja po prostu kompletnie nie znam javy...

jak to poprawnie zapisać tak żeby uzyskac to o co mi chodzi...?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

hmm, po pierwsze.. po co robić prywatny member objects, a potem udostępniać go w całości publicznie poprzez getObjectList(). Prywatność tego membera jest.. żadna :)

 

a druga sprawa... RTFM, że tak powiem. Zawsze mówię/nakłaniam świeżych programistów do trzech rzeczy...

 

1. Zanim użyjesz klasy/funkcji - przeczytaj manual

2. Debuger to Twój największy przyjaciel

3. Czytaj i zrozum błędy wyświetlane przez kompilator/debuger

 

te trzy zasady sprawią, że programowanie będzie przyjemnością a nie katorgą.

 

Proszę, nawet znalazłem dokładny opis interfejsu List http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html - czy tak trudno przeczytać jak się dobrać do elementów w liście? Sory, że odpowiadam naokoło, ale javą gardzę i pisałem w niej tylko kiedy musiałem :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

czemu akurat prywatny member objects to ja nie mam pojęcia, bo kto inny jest głową projektu i tak sobie zazyczył, ja się nie kłócę javy nie lubię i nie rozumiem

manuala widziałam, fakt że się nie wczytywałam, ale tak najchętniej to bym zobaczyła przykład bo to do mnie najbardziej przemawia

ale i tak dzięki za rady i linka, postaram się zastosować i zobaczymy co z tego wyjdzie ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

hmm, po pierwsze.. po co robić prywatny member objects, a potem udostępniać go w całości publicznie poprzez getObjectList(). Prywatność tego membera jest.. żadna :)

Slyszales o enkapsulacji/hermetyzacji? Jesli tak, to zadales glupie pytanie, jesli nie to zapraszam do google. W kazdym razie w Javie uzywa się tego szeroko i dobrą praktyką jest tworzenie pól jako prywatnych i udsotępnianie getterów i setterów do dostępu do pola.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jakkolwiek nadal uważam, że jest to bezcelowe i po prostu głupie w tym przypadku. getery i settery mają umożliwiać nadzorowany dostęp do hermetycznych danych. A tutaj, co z tego, że member jest prywatny, skoro mam do niego pełny dostęp bez ograniczeń tylko zamiast dostępu publicznego wprost, mam dostępu publiczny przez dodatkową furtkę.

 

Niektórzy mówią, że dobrą praktyką jest nieudostępnianie w ogóle geterów i setterów, gdyż godzi to w podstawowe doktryny obiektowości - hermetyzacji. Teoria ta mówi iż nie powinno się pytać obiektu o jego dane prywatne - bo przecież w końcu po to są prywatne, żeby nikt z zewnątrz nie miał do nich dostępu... tylko obiekt powinno się prosić aby wykonał dla nas jakieś zadanie. Więc zgodnie z tą wizją, sory, ale udostępnianie całych memberów prywatnych nie jest zgodne z programowaniem obiektowym. W javie jest to nadużywane, już nie wnikam z jakich względów.

 

Z resztą, może pomożesz koleżance jako fanatyk javy, a nie szukasz zaczepki :)

 

Nie wiem czy w javie, ale w .NETcie są konstrukcje zwane property, które są niby atrybutami ale tworzą getery i settery, które by default dodają do klasy membery prywatne powiązane z nimi, aczkolwiek można i nawet powinno się rozpisywać getera i setera tak aby wszelki dostęp do prywatnych danych obiektu był nadzorowany.

 

Są oczywiście przypadki, że jest to bezcelowe, lub po prostu wynika to z wygody programisty, ale na pewno udostępnianie memberów prywatnych w całości nie jest dobrą praktyką. A robienie geterów i seterów jest tylko zabiegiem na przyszłość i próbą wpojenia programistom dobrych manier - do których w końcu trzeba dorosnąć i wiedzieć, po co właściwie jest geter i seter... Tak, że zapraszam na google :wink:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Bardziej chodzi mi o to, że jak ktoś się już uczy Javy to niech uczy się też pewnych standardów. Gettery i settery bardzo często wykorzystywane przez różne frameworki, które uzyskują przez nie dostęp do pól (za pomocą mechanizmu refleksji), np. Spring Framework (dużo trzeba by się rozpisywać w tej kwestii, więc zostawiam to tak ogólnikowo). Tak czy siak, w każdej branży/środowisku są jakieś konwencje, których powinno się przestrzegać, w Javie dobrą praktyką jest tworzenie getterów i setterów, jest to zaaprobowane przec cały światek Javy i jesli ktoś, kiedyś zechce poszukać pracy jako programista Java, to niech lepiej zna te konwencje. Nie miałem zamiaru się z tobą kłócic, po prostu dałeś raczej niedobrą radę przyszłemu (?) programiście Javy.

Fanatykiem Javy nie jestem, owszem zajmuję się nią zawodowo, ale nie toczę jakis bojów na temat wyższości jednego języka nad drugim.

 

 

A rozwiązanie np. takie:

for(SimpleObject so : getobjectlist()) {    int posX = so.GetPosition().x;    int posY = so.GetPosition().y;    String name = so.identifyobject();}

Tyle że zakładam, że klasa drect rzeczywicie ma takie pola jak x i y.

Poza tym, nazwy metod piszemy z małej litery, a nazwy klas z dużej.

Edytowane przez thuGG

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

no być może, w javie są jakieś wskazania żeby tak robić, skoro pracujesz w tym to wiesz lepiej ode mnie. Więc jeśli nie IDE (JCreator, temat obok) :wink: to to jest właśnie jeden z powodów dla których java mi nie podchodzi :)

 

pzdr;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...