Hirdetés

2024. május 4., szombat

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Java programozás (kiemelt téma)

Hozzászólások

(#4851) WonderCSabo válasza alratar (#4850) üzenetére


WonderCSabo
félisten

Nem biztos, hogy jó lesz, nem teljesen értem, hogy mit akarsz. Egyébként Object-et típusparaméternek nem sok értelme van megadni, legalábbis ebben az esetben semmi.

Ha Object-et adsz meg típusparaméternek, akkor bármilyen objektumot berakhatsz a konténerbe. Pl.

Vector<Object> vector = new Vector();
vector.add(new String());
Integer integer = (Integer) vector.get(0);

Az utolsó sor fordítási időben teljesen legális kód, de ClassCastException-nel jár, hiszen a String nem Integer. A vicc az, hogy a generic-et pont arra találták ki, hogy ezt a problémát kiküszöbölje, Te pedig arra akarod használni, hogy mégis probléma lehessen belőle...

[ Szerkesztve ]

(#4852) alratar válasza WonderCSabo (#4851) üzenetére


alratar
addikt

Nos, röviden azt szeretném, hogy letároljam egy termék (pl valamilyen gyümölcs) nevét, és az adott termék két tulajdonságát (ár és, hogy mennyi van belőle).

Erre írtam egy termek nevű osztályt, ahol az adott árura vonatkozó metódusok vannak. (nevének a lekérdezése, árának a lekérdezése stb.)
És írtam egy másik, Raktar osztályt, ahol deklaráltam a vektoromat és hozzá szeretném adni a vektorhoz a három adatot. (áru neve, ára, és a mennyisége)

10 féle ember van: aki ismeri a bináris számrendszert, és aki nem

(#4853) WonderCSabo válasza alratar (#4852) üzenetére


WonderCSabo
félisten

Igen, és előbb jött erre az a válasz, hogy a termék nevét is vedd bele a termek osztályba (Java osztály nagybetűvel kezdődjön BTW). Így a Vector-od típusparamétere pedig lehet termek.

(#4854) WonderCSabo válasza WonderCSabo (#4853) üzenetére


WonderCSabo
félisten

Ha pedig mindenképpen úgy érzed, hogy a termék neve nem tartozik bele a termek osztályba, akkor használhatsz egy Map<String, Termek> konténert, ami névből - termek asszociációkat tartalmaz.

(#4855) alratar válasza WonderCSabo (#4853) üzenetére


alratar
addikt

És ez így is van.

class Termek{
private String nev;
private double ar;
private double menny;

public Zoldseg(String nev, double ar) {
this.nev = nev;
this.ar = ar;
menny = 0.0;
}

public String getNev() {
return nev;
}

public double getAr() {
return ar;
}

public double getMenny() {
return menny;
}

public void setMenny(double menny) {
menny += menny;
}

}

public class Raktar {
Vector<String> aru = new Vector<String>();

public void felvitel() {
String nev = Console.readLine("Kérem adja meg az áru nevét: ");
Termek aru = new Temek(nev, 0.0);
if (zoldsegek.contains(aru)) {
System.out.println("Az áru már létezik!");
return;
}
double ar = Console.readDouble("Adja meg az áruárát: ");
double menny = Console.readDouble("Adja meg az áru mennyiségét (kg): ");
aru.add(new Termek(nev, ar));
}

A Termek osztály még nincs kész és valszeg nem is jó.

10 féle ember van: aki ismeri a bináris számrendszert, és aki nem

(#4856) modder válasza alratar (#4855) üzenetére


modder
aktív tag

Te minket itt át akarsz verni ezzel a kóddal!

(#4857) WonderCSabo válasza alratar (#4855) üzenetére


WonderCSabo
félisten

Itt eléggé nagy kavar van.

A Vector<String> aru példányváltozót elfedi a lokális Termek aru - ez bár legális, nem éppen okos döntés. Valamelyiket mindenképpen nevezd át, az elsőnek van rossz neve mellesleg.

A zoldsegek Vector hol van definiálva?

Termek aru = new Temek(nev, 0.0);
if (zoldsegek.contains(aru)) {

Ez itt mindig false-ot fog visszaadni, mivel a contains az equals metódust hívja meg, ami pedig alapesetben a referenciákat hasonlítja össze, azok pedig sosem fognak egyezni, hiszen mindig új objektumot hozol létre. Definiáld felül az equals és hashCode metódust a Termek osztályban, hogy ez értelmesen működjön.

A Vector<String> aru típusparamétere miért nem Termek?

Console.readLine

Csak kíváncsiságból kérdezem: ezt az osztályt milyen framework szolgáltatja? :)

[ Szerkesztve ]

(#4858) Jim-Y válasza alratar (#4855) üzenetére


Jim-Y
veterán

Én ezt így csinálnám.

http://pastebin.com/0pWx7sH7

Nyílván csinálhatnál ekkor a gyümölcsöknek is egy külön osztályt. De akár az is játszik, hogy nem csinálsz egy külön interface-t, hanem pl a Zöldséget a Termék osztályból származtatod, mint ahogy a Gyümölcsöt is.
Ez sem egy világbajnok kód, de szerintem annál amit csináltál jobb :))

[ Szerkesztve ]

(#4859) fatal` válasza WonderCSabo (#4857) üzenetére


fatal`
titán

Ráadásul a termék osztálynak nem igazán lehet Zoldseg konstruktora.

(#4860) alratar válasza WonderCSabo (#4857) üzenetére


alratar
addikt

Hops, a zöldségek egy régebbi állapotból maradt meg és úgy látszik azt elmulasztottam átírni. :B

Valahonnan szedett a haverom egy extra nevű csomagot és abban van konzol osztály, így az működik. :)

@modder: dehogy!

[ Szerkesztve ]

10 féle ember van: aki ismeri a bináris számrendszert, és aki nem

(#4861) WonderCSabo válasza Jim-Y (#4858) üzenetére


WonderCSabo
félisten

Az equals és a hashCode felüldefiniálása nélkül ez se fog menni.

(#4862) Karma válasza alratar (#4855) üzenetére


Karma
félisten

A menny += menny csak nekem tűnt fel?

Mindenesetre eddig ez elég FUBAR, szerintem lassítanod kéne egy kicsit és két dolgot mindenképp megejteni: kicsit végiggondolni hogy ki kivel van, és némi konvenciót is kéne találnod a tagváltozókban (vagy kiírni a this-t, mert így a settereid nem sokat csinálnak.

WonderCsabo: a += -re gondoltam explicite ;)

[ Szerkesztve ]

“All nothings are not equal.”

(#4863) WonderCSabo válasza Karma (#4862) üzenetére


WonderCSabo
félisten

Igen, bár az aru kapcsán már én is felhívtam erre a problémára a figyelmet. :)

(#4864) WonderCSabo válasza Karma (#4862) üzenetére


WonderCSabo
félisten

Arra írtam, hogy igen, az csak Neked tűnt fel. :)

(#4865) alratar válasza Karma (#4862) üzenetére


alratar
addikt

Azzal meg mi baj van?
Mármint a +=-vel.

10 féle ember van: aki ismeri a bináris számrendszert, és aki nem

(#4866) WonderCSabo válasza alratar (#4865) üzenetére


WonderCSabo
félisten

Az, hogy amikor ezt írod, hogy

public void setMenny(double menny) {
menny += menny;
}

Akkor a paraméterben kapott menny változó értékét növeled meg, és nem a példányváltozóét. A lokális változó mindig elfedi a tagváltozót. Úgy tudsz ilyen esetben a tagváltozóra hivatkozni, hogy:

public void setMenny(double menny) {
this.menny += menny;
}

A másik opció, hogy átnevezed a paramétert. Tényleg el kéne olvasnod valami alap Java könyvet, vagy vmi tutorialt végigcsinálni. De egyébként ez a jelenség más nyelveken is így vna.

[ Szerkesztve ]

(#4867) alratar válasza WonderCSabo (#4866) üzenetére


alratar
addikt

Ja, az direkt van úgy.

10 féle ember van: aki ismeri a bináris számrendszert, és aki nem

(#4868) WonderCSabo válasza alratar (#4867) üzenetére


WonderCSabo
félisten

De ennek semmi értelme! A függvény lefutása után a lokális változó felszabadul, és a növelt érték megy a kukába... Gondolom itt azt akartad elérni, hogy az osztály által reprezentált áru mennyisége változzon meg, nem?... Mert arra a jelenlegi függvényed nincs hatással.

[ Szerkesztve ]

(#4869) Karma válasza alratar (#4865) üzenetére


Karma
félisten

A másik baj amellett, hogy a mennyiség mindig nulla marad az előzőek miatt az az, hogy úgy nevezted el a metódust, hogy "set". Ez azt jelenti mindenki más számára, hogy a paraméterben megadott szám lesz az új érték, nem pedig megnöveled azzal :U

“All nothings are not equal.”

(#4870) caindwan


caindwan
tag

ÖÖ nem tudom mennyire lesz értelmes a kérdés. De ha tesztelni szeretnék, hogy egy kódolás mennyire biztonságos.. Van erre valamilyen program?

(#4871) Karma válasza caindwan (#4870) üzenetére


Karma
félisten

Vanni van, bár olyan sok tapasztalatom nincs velük. A FindBugs például egy ingyenes eszköz ilyesmire, be lehet iktatni a build folyamatba is.

“All nothings are not equal.”

(#4872) Superhun válasza Karma (#4871) üzenetére


Superhun
addikt

Szerintem az encryption-ra gondolt. :D

(#4873) Karma válasza Superhun (#4872) üzenetére


Karma
félisten

Hát de akkor semmi értelme a kérdésnek ;] :F
És nagyon nem illik házilag titkosítást írni...

[ Szerkesztve ]

“All nothings are not equal.”

(#4874) caindwan válasza Karma (#4873) üzenetére


caindwan
tag

Miért nem? :F

(#4875) WonderCSabo válasza caindwan (#4874) üzenetére


WonderCSabo
félisten

Azért mert a meglévő algoritmusokat nálunk sokkal okosabb emberek készítették, matematikailag bebizonyították, kitesztelték,rengetegen használják és óriási tapasztalat van hozzájuk, továbbá nagyon jó implementációk. Ezek közül egy házilag barkácsolt titkosításról általában egyik sem mondható el. Továbbá ez a dolog is u.a., mint a programozás többi része: felesleges rugózni, ha már van kész megoldás.

(#4876) alratar válasza WonderCSabo (#4868) üzenetére


alratar
addikt

Igen, jól látod, hogy az áru mennyiségét akarom azzal változtatni.
De mint mondtam, az direkt van úgy, mivel mást kellett csinálnom, így a bemásolás pillanatáig nem írtam áát.

10 féle ember van: aki ismeri a bináris számrendszert, és aki nem

(#4877) WonderCSabo válasza alratar (#4876) üzenetére


WonderCSabo
félisten

Azért a "direkt van így", az elég erős kifejezés akkor...

(#4878) alratar válasza WonderCSabo (#4877) üzenetére


alratar
addikt

Na igen! :DDD

10 féle ember van: aki ismeri a bináris számrendszert, és aki nem

(#4879) Panthera


Panthera
őstag

Sziasztok!

Elnézéseteket kérem, hogy itt teszem fel a kérdésem, de ennél jobb helyet nem találtam hirtelen és nagyon sürgős lenne a dolog.
A következő hibára tudtok valamilyen megoldást? Semmilyen nyomtatványt nem lehet a NAV kitöltőprogramjához telepíteni (több gépen is próbáltam). Vannak keresési találatok a hibára, de ebben az esetben szerintem a külföldi leírásokkal nem sokra megyek.

Előre is köszönöm!


[ Szerkesztve ]

(#4880) Karma válasza Panthera (#4879) üzenetére


Karma
félisten

Én nem látok hibát, csak egy figyelmeztetést a szoftver aláírásáról. Ha Runt nyomsz az első ablakban, akkor mennie kéne tovább.

“All nothings are not equal.”

(#4881) Panthera válasza Karma (#4880) üzenetére


Panthera
őstag

Hát sajnos semmilyen nyomtatvány nem megy fel, ezt dobja fel:

Én úgy értelmeztem, hogy a tanusítvány hibája miatt nem fog menni.

[ Szerkesztve ]

(#4882) pokerecske1 válasza Panthera (#4881) üzenetére


pokerecske1
csendes tag

configure java -t indítsd el
security fülnél add az exceptionlistához a címet
(amit utoljára küldtél képet ott amit a locationnál ír)

(#4883) Panthera válasza pokerecske1 (#4882) üzenetére


Panthera
őstag

Köszönöm a tippet, a javaslat nem hozott eredményt, de rávezettél, mert mellette lejjebb vettem a biztonsági szintet és így engedte a telepítést! :R

(#4884) floatr válasza alratar (#4878) üzenetére


floatr
veterán

Akkor hadd szóljak ki egy kicsit az enterspájzból én is. Ha egy metódusnak a neve "set...", de nem értéket állít be, hanem összead, akkor -- még ha azt is csinálná, amit kellene -- egy kód review-nál fognak hátba vágni. Másrészt meg sokak számára fájó pont, de célszerű legalább az elnevezések esetében angolt használni. Ha egy végzős egyemistát bedobnak a mély vízbe, nagy eséllyel kerülhet olyan projektbe, ami külföldi kooperációban készül.

De ha a konkrét példánál maradunk, akkor sokkal hatékonyabb lenne egy Map-be tárolni, és kulcs (név) alapján keresni, vagy Set-be pakolni, és hashCode/equals metódusokat használni. Ha ez valami oktatáshoz kötődik, akkor nem értem, hogy miért nem lehet életszerűbb példákon keresztül oktatni.

(#4885) alratar válasza floatr (#4884) üzenetére


alratar
addikt

Egy raktár programban, ami új termékek felvételéből, számlázásából, pótlásából áll mi nem életszerű?

10 féle ember van: aki ismeri a bináris számrendszert, és aki nem

(#4886) floatr válasza alratar (#4885) üzenetére


floatr
veterán

Ha a cél a Vector használata, akkor nem életszerű.
Az ilyen nyilvántartásokat Map vagy Set használatával sokkal egyszerűbb, és gyorsabb is kezelni. Ha rendezési elv is van mögötte, akkor vannak rendezhető Map-ek is. Nem véletlen, hogy általában adatbázist is raknak mögé.

(#4887) Karma válasza floatr (#4886) üzenetére


Karma
félisten

Más szóval a feladat életszerű, de a megvalósítás kevésbé életképes, nem?

“All nothings are not equal.”

(#4888) floatr válasza Karma (#4887) üzenetére


floatr
veterán

Nem tudom melyik volt a kiindulási alap, így csak az egészre tudom azt mondani, hogy nem az igazi. Mindegy, megint az jön le, hogy kötekedek :)

(#4889) Jim-Y


Jim-Y
veterán

Sziasztok, miért van az, hogy ez helyes:

public class RaktarV extends ArrayList<Termek> { }

ugye ez ha minden igaz azt, jelenti, hogy a RaktarV egy objektuma egy olyan ArrayList-et valósít meg ami Termek tipusú elemeket tárolhat.

de ez már helytelen:

public class RaktarV extends ArrayList<T extends Termek> { }
helyette ez a helyes
public class Raktar<T extends Termek> extends ArrayList<T> { }

a kérdés csak annyi lenne, hogy akkor utóbbi esetben máshogyan kell szintaktikailag jelenzni és kész, vagy van valami más különbség is?

Ugye a második esetben a Raktar egy objektuma egy olyan ArrayListet valósít meg ami Termek, vagy Termek subclass tipusu elemeket tárolhat.

Nekem az nem világos, hogy miért nem így kell ezt is megadni:
public class RaktarV extends ArrayList<T extends Termek> { }

?

üdv

(#4890) WonderCSabo válasza Jim-Y (#4889) üzenetére


WonderCSabo
félisten

public class RaktarV extends ArrayList<T extends Termek> { }

Ez semmiképpen nem lehet helyes, hiszen a T típust sehol sem deklaráltad.

Ebben az esetben nincs típusparamétere az osztálynak:

public class RaktarV extends ArrayList<Termek> { }

Ebben az esetben meg van:

public class Raktar<T extends Termek> extends ArrayList<T> { }

Mig az első esetben a RaktarV-be bármilyen Termek leszármazottat lehet rakni, a típusparaméteres verzióban csak az aktuális típusparamétert, vagy annak leszármazottjait, pl.

RaktarV<Gyumolcs> raktar;
raktar.add(new Termek()); // nem fordul

[ Szerkesztve ]

(#4891) Jim-Y válasza WonderCSabo (#4890) üzenetére


Jim-Y
veterán

Miért a helyes esetben a T-t hol deklaráltam?

public class Raktar<T extends Termek> extends ArrayList<T> { }

aha, akkor azt a különbséget már értem, hogy ha
ArrayList<Termek> -ként hozom létre az osztályt, akkor ebbe mehet Termek, és Termek leszármazott, a másik tipusparaméteres esetben pedig a typus argumentumtól függ, hogy mi mehet bele, tehát
RaktarV<T extends Termek> extends ArrayList<T> esetén ha olyat írok hogy
RaktarV<Gyumolcs> = new ...
akkor Csak Gyumolcs és annak leszármazottai mehetnek bele, de Termek mar nem, csak ugy ha a tipus-argumentum az Termek ->
RaktarV<Termek> = new ...

De azt továbbra sem értem, hogy ezt miért így kell szintaktikailag létrehozni :D Bár lehet ezen feleslegesen pörgök, jegyezzem meg 'oszt kész ^^

[ Szerkesztve ]

(#4892) WonderCSabo válasza Jim-Y (#4891) üzenetére


WonderCSabo
félisten

A RaktarV-nek deklaráltál egy típusparamétert, ott. Egyébként bővítettem a hszemet. Javaslom olvasd el a Java genericset.

public class Raktar<T extends Termek>

[ Szerkesztve ]

(#4893) Jim-Y válasza WonderCSabo (#4892) üzenetére


Jim-Y
veterán

Elolvastam, onnan vetődött fel a kérdés :D mod: Lehet, nekiugrok még egyszer ;)

[ Szerkesztve ]

(#4894) WonderCSabo válasza Jim-Y (#4893) üzenetére


WonderCSabo
félisten

Akkor nem olvastad el elég részletsen. :)

(#4895) floatr válasza Jim-Y (#4891) üzenetére


floatr
veterán

Az új osztály definíciójánál az ősosztály paraméteres. Vagy konkretizálod, hogy mi a paraméter, vagy hagyod eredeti formájában. A paraméterre vonatkozó megszorítást (Termek) csak az éppen definiált osztálynál tehetsz. Ez a megszorítás annyit tesz, hogy a fordító csak olyan Raktar objektumot enged létrehozni, aminek a paramétere Termek típusú, vagy annak leszármazottja. Ha Gyumolcs paraméterrel hozod létre, akkor onnantól kezdve már nem adhatsz hozzá bármilyen Termek leszármazottat, csak ami a Gyumolcs-ből ered.

Ha pl a Kifli is termék (de ugyebár nem Gyumolcs), akkor ez nem fog fordulni:

new Raktar<Gyumolcs>().add(new Kifli());

mert ez egy "gyümölcsraktár" példány, ahová kiflit nem lehet raktározni

szerk.:
a paraméteres leszármaztatásnál vagy az osztály definíciójakor szabod meg, hogy mi a paraméter, vagy az osztály is paraméteres lesz. Ha paraméteresen hagyod, akkor megmondhatod, hogy milyen ősosztályból lehet paraméter használni, amikor az osztályt létrehozod. A megszorítást meg azért az új osztálynál kell bevésni, mert arra vonatkozik a megszorításod, nem az ősosztályra.

[ Szerkesztve ]

(#4896) Jim-Y válasza floatr (#4895) üzenetére


Jim-Y
veterán

Köszönöm a válaszokat, közben sikerült megtalálnom a választ, az egyik könyvemben, ahol kb az van leírva amit te is leírtál :R

(#4897) -v-


-v-
addikt

Tudtok mondani valami legegyszerűbb ingyenes tool-t amivel UI mockupokat tudok rajzolgatni?
Valamit, ami bevált.

Kösz

(#4898) Senhi válasza -v- (#4897) üzenetére


Senhi
aktív tag

Esetleg: [link]

(#4899) -v- válasza Senhi (#4898) üzenetére


-v-
addikt

Igen, ez kell nekem, köszi :R

[ Szerkesztve ]

(#4900) n00n


n00n
őstag

Sziasztok!

A cégnél ahol dolgozom van egy elég kokány Java-ban írt mentéskészítő alkalmazásunk. Arra gondoltam, hogy teljesen újraírnám, mert néha furcsán viselkedik. Tanultam főiskolán Java programozást, így az alapok meg vannak és tényleg nem bonyolult. Viszont pár dologban a segítségeteket szeretném kérni.

Amit tudni kell:

NetBeans 7.4-et használok
7-es Java-val.

A program az alábbiakat tudja:

Van egy grafikus felület. Rajta egy információs sor, ahol megjelenik az utolsó mentés dátuma, illetve a mentés hosszának ideje. Ezen kívül egy gomb van még Mentés felirattal. A gomb megnyomásakor ellenőrzi, hogy meg vannak-e a szerveren a mentendő fájlok (/home/server/mentendok), be van-e dugva a mentéshez használatos külső merevlemez (dev/eszkozneve). Ha minden oké, akkor felcsatolja a lemezt, a /mnt/mentes-disk alá. Majd elkezdi másolni az adatbázis fájlokat, ebből 4 van. Ha ezzel végzett akkor van egy pdf nevű mappa, amiben körülbelül 10 ezer kisebb fájl van. Ezeket is elkezdi másolni, viszont ha már meg van akkor kihagyja. Ha végzett, akkor lecsatolja a merevlemezt, frissíti az ablakon lévő információkat (utolsó mentés, mentés hossza).

Szóval ezt kellene megírni. Ti merre indulnátok el? Mit használnátok lemez csatoláshoz és lecsatoláshoz Linux alatt?

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Java programozás (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.