Vlastní události – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Vlastní události – Java – Fórum – Programujte.comVlastní události – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Boox
~ Anonymní uživatel
6 příspěvků
17. 10. 2013   #1
-
0
-

Zdravim,

existuje v jave nějaká možnost nebo udělat vlastní třídu, která by fungovala a pracovala s vlastníma událostma podobně jako to má C# ?

Tím myslim, že v C# se jednoduše výtváří události (klíčové slovo "event" a pomocí delegáta). Šlo by něco podobného udělat i v Jave? Nějak se mi nelíbí a přijde mi komplikovaný dělat 2-3 objekty (EventListener, EventHandler, [EventObject])

V C# to vypadá třeba takto: 

class NumbersDB
{
    // vytvoreni udalosti pro pridani cisla
    public event Action<int> OnNewNumber(int number) = delegate { }

    // pridani cisla a zavolani udalosti
    public void AddNumber(int number)
   {
       OnNewNumber(number);
   }
}

class MainClass
{
    private NumbersDB db = new NumbersDB();

    public MainClass()
    {
        // zachyti udalost pridani cisla
        db.OnNewNumber += number => { Console.WriteLine(number); };

        // prida cislo
        db.AddNumber(100);
    }
}

A moje otázka tedy je, jak toto naprogramovat v Jave, aby to bylo takto jednoduchý :)

Díky

Nahlásit jako SPAM
IP: 93.90.162.–
Reklama
Reklama
Boox
~ Anonymní uživatel
6 příspěvků
17. 10. 2013   #2
-
0
-

Fakt nikdo nevíte?

Momentálně to dělám takto, ale přijde mi to dost neohrabaný http://www.java2s.com/Code/Java/Event/CreatingaCustomEvent.htm

Proste vytvářet 3 soubory +1 ten hlavní, kde se to použije mi přijde zbytečně komplikovaný. Sice to můžu dát jako vnořený třídy, ale potom se to stává nepřehledný trochu a přijde mi to takový "nečistý" :-/

Nahlásit jako SPAM
IP: 93.90.162.–
lukber0
Newbie
17. 10. 2013   #3
-
0
-
Nahlásit jako SPAM
IP: 193.85.250.–
Boox
~ Anonymní uživatel
6 příspěvků
18. 10. 2013   #4
-
0
-

Škoda no, když budu mít 5 tříd, kde každá bude mít nějaký události, tak pro každou třídu musím mít další 3 třídy jen pro události, čili z 5ti tříd se mi stane 20 =D To je maso prostě a až to začíná být lehce nepřehledný

Nahlásit jako SPAM
IP: 93.90.162.–
lukber0
Newbie
18. 10. 2013   #5
-
0
-

#4 Boox
Proč by jsi pro každou událost musel dělat 3 třídy? Stačí jedna která bude reprezentovat samotnou událost a jednu pro handler. Eventbus bude reprezentovat třída "observer" která je součástí javy.

Nahlásit jako SPAM
IP: 193.85.250.–
lukber0
Newbie
18. 10. 2013   #6
-
0
-

Mrkni na ten odkaz co jsem posílal, dole je příklad.

Nahlásit jako SPAM
IP: 193.85.250.–
Boox
~ Anonymní uživatel
6 příspěvků
21. 10. 2013   #7
-
0
-

#6 lukber

na to jsem koukal, ale nějak to nechápu.. tam je v rozhraní jenom invoke() ale nemůžu si tam dát vlastní/další, abych nenarušil struktůru observeru nebo se pletu?

můžeš mi zkusit udělat jednoduchej příkad na tu ukázku v C# co jsem psal? resp. to přepsat do Javy, jak by to vypadalo, pokud možno co nejelegantněji :)

Nahlásit jako SPAM
IP: 93.90.162.–
lukber0
Newbie
21. 10. 2013   #8
-
0
-

Mohlo by to vypadat nějak takto:

public class NumbersBS extends Observable {
	
	public class NumberChangedEvent {
		private final int oldValue;
		private final int newValue;

		public NumberChangedEvent(int oldValue, int newValue) {
			super();
			this.oldValue = oldValue;
			this.newValue = newValue;
		}

		public int getOldValue() {
			return oldValue;
		}

		public int getNewValue() {
			return newValue;
		}

	}

	private int number;

	public void addNumber(int number) {
		int oldValue = this.number;
		int newValue = number;
		
		this.number = number;
		setChanged();
		notifyObservers(new NumberChangedEvent(oldValue, newValue));
	}

}

public class MainClass {

	public static void main(String[] args) {
		NumbersBS db = new NumbersBS();

		db.addObserver(new Observer() {

			@Override
			public void update(Observable o, Object arg) {
				if (arg instanceof NumberChangedEvent) {
					NumberChangedEvent event = (NumberChangedEvent) arg;
					System.out.println("Zmena hodnoty(stara/nova):" + event.getOldValue() + "/" + event.getNewValue());
				}
			}
		});

		db.addNumber(100);
		db.addNumber(200);
	}

}

Trochu jsem to rozšířil o novou a starou hodnotu. Problém trochu je, že se vždy volá metoda "update".

Nahlásit jako SPAM
IP: 193.85.250.–
lukber0
Newbie
21. 10. 2013   #9
-
0
-

Na místo NumberChangedEvent by mohlo být rozhraní/třída OnNewNumber atd.
 

Nahlásit jako SPAM
IP: 193.85.250.–
Boox
~ Anonymní uživatel
6 příspěvků
21. 10. 2013   #10
-
0
-

aha, ale v použití je potom jen jedna metoda update, kde se zachytí všechny události a pomocí instanceof? Takže když tam bude třeba 5 událostí a ja si budu chtít zachytit jen jednu, tak to nějak jde přes observer?

Nahlásit jako SPAM
IP: 93.90.162.–
lukber0
Newbie
21. 10. 2013   #11
-
0
-

#10 Boox
no právě to je ta nevýhoda. Je tam jen jedna metoda update a kontaktováni budou všichni "posluchači". Rozlišení o jakou akci se jedná je právě v tom instanceof

Nahlásit jako SPAM
IP: 193.85.250.–
lukber0
Newbie
21. 10. 2013   #12
-
0
-

Nebo by se dal využít javax.swing.event.EventListenerList. Použití je v javax.swing.JComponent

Nahlásit jako SPAM
IP: 193.85.250.–
Boox
~ Anonymní uživatel
6 příspěvků
22. 10. 2013   #13
-
0
-

Já události dělám takto zatím http://ideone.com/BS45It může tam být někde chyba/překlep, psal jsem to z hlavy.. ale jde mi o to, jestli je tento způsob správněj nebo existuje elegantnější řešení

Nahlásit jako SPAM
IP: 93.90.162.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

Podobná vlákna

C# události — založil Wabbit

Udalosti v C# — založil jirkab

Události — založil XP

Nefunkční události — založil jenoc

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý