- Több mint 500 millió dollárt spórolt az AI a Microsoftnak
- Ismét 128 és 256 GB-os memóriaszetteket villantott a G.Skill
- Panorámás miditorony jött a Chieftec fémjelzésével
- Ráfordult a célegyenesre a SiPearl első szerverprocesszora
- A partnerektől függ, hogy lesz-e Arc csúcs-VGA az aktuális generációban
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Léghűtés topik
- OLED TV topic
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- AMD Ryzen 9 / 7 / 5 7***(X) "Zen 4" (AM5)
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Milyen monitort vegyek?
- Monitor hiba topik
- Azonnali informatikai kérdések órája
- Fejhallgató erősítő és DAC topik
Új hozzászólás Aktív témák
-
M_AND_Ms
veterán
A karikírozás, mint fogalom ismert?
Amúgy ezt a "kubikos" megfogalmazást egy számomra igen nagyra értékelt ember mondta, aki egy igencsak jól prosperáló, nemzetközi szinten is sikeres több, száz főt foglalkoztató szoftverfejlesztő céget alapított, alkotott, vezetett és vitt sikerre, egészen a haláláig. Ő tudta, hogy mit jellemez a kubikos hasonlattal.
-
válasz
M_AND_Ms #6997 üzenetére
Lehet, hogy en dolgozom rossz (jo?) helyen, ilyennel meg nem talalkoztam. 100%-os specifikacio ugyebar nem letezik. A modern professzionalis fejleszteshez lenyegeben arra van szukseg, hogy a programozo domain expert is legyen.
Vagy legalabbis en csak olyan helyeken dolgoztam meg, ahol az uzleti logikat a fejlesztok jobban ertettek, mint a felhasznalok. (Ebben voltak neurobiologusok, market makerek, mittudomen.)
-
Aethelstone
addikt
szoftvernigger...mi így nevezzük a mezei programozót
-
Ursache
senior tag
Ahogy mondtad, hogy programnyelvet kell felismertetni, feldolgozni, egyből a fordítóprogramok tárgy ugrott be, onnét meg bisonc++ és flex. Gondoltam, hogy java-ban is van valami ehhez hasonló (ennek megfelelő) változat, és van
Szépen elkülönítve vannak a részek, struktúrált felépítés, semmi gányolás. Lexikális elemzés, szintaktikus elemzés, szemantikus elemzés, kódgenerálás (kódoptimalizálás).
De ennek azért komoly elméleti háttere is van (LA)LR(1) vagy általánosítva k-ra. SLR(1), meg mindenféle formális nyelvek, automata, grammatikák, nyelvosztályok. VDA (véges determinisztikus automaták), különféle algoritmusok, CYK algo, etc... Szóval könnyen el lehet benne veszni.
Hajrá!
-
thon73
tag
válasz
Ursache #6991 üzenetére
Ööö. Ilyesmi csak két nagyságrenddel egyszerűbben.
Az egyik kollégám mondta, hogy Javaban nem programozni kell, csak tudni, hogy hol írták már meg...
Ebben van valami igazság.Nekem két funkció is kellett - "human readable" adatokkal feltöltse az adatstrutúrát (ilyen már van pl. xml), - de (2.) feltöltés közben egyfajta "előkészítő" adatfeldolgozást is végezzen; ha a forrás azt indokolja. Ez utóbbit nem lehet valószínűleg saját kód hozzápasszintása nélkül megoldani...
((A valóságban meg egy hevenyészett (sőt tákolt) tesztkód adta meg az alapötletet, ami átgyúrás után rövid, tömör és tetszetős lett. Bár valaki már biztos ezt is megírta...))Köszönöm a fenti linket, már elkezdtem elmélyedni benne
-
thon73
tag
válasz
Aethelstone #6988 üzenetére
Konkrétan, használom, azért kellett felfedeznem
Egy speciális szöveget (egyfajta programnyelvet) szeretne feldolgozni a program. A beolvasás minden adat-elemnél közel azonos, csak éppen pl. a String String-ként, a numerikus érték Long-ként érkezik. Az érkező adatelemekről egyébként elég sok mindent tudok, pl. azt is, hogy a numerikusak milyen pontosságúak kell legyenek. Nem csupán java értelemben, hanem pl. ha egy szín jön, az unsigned 32 bittel írható le (ami egyébként belefér egy signed int-be).
Az eredeti megvalósítás ellenőrizte a pontosságot, aztán visszaadott egy - a kívánt pontosságnak megfelelő - Long értéket. Csakhogy, egyszerűbb ha pl. pont a szineknél kapásból egy Integer pontosságú értéket ad vissza, mert akkor nem kell tovább bonyolítani a dolgot az adatot tároló változók szintjén.
Egyébként az egész teljesen prímán működött, amíg a különböző típusokat különböző metódusok szedték elő. Viszont egy közös Object-tel egyetlen átlátható metódusra egyszerűsödött az egész - éppen csak ide-oda kellett volna konvertálnom az adatokat. Na, ez nem ment. Utána meg már az érdeklődés is hajtott.
Bocs, ez kicsit leegyszerűsítette a problémát, de remélem, érthető maradt.
(Mivel nem vagyok profi programozó, azt sem igazán tudtam, hogy mire keressek a googliban. Végül aztán sikerült megtalálni.)
-
Ursache
senior tag
Ezt en is meg akartam kerdezni, csak nem mertem
-
thon73
tag
Bocsánat, hogy magamnak válaszolok, de időközben végül egy próbaprogrammal megfejtettem:
Object longobject = 0x0102030405060708L;
long longprimitive = (long)longobject;
// char charprimitive = (char)longobject; -> exception
// int intprimitive = (int)longobject; -> exception
char charprimitive = (char)(long)longobject;
int intprimitive = (int)(long)longobject;
// Character charobject = (Character)longobject; -> exception
// Integer intobject = (Integer)longobject; -> exception
Character charobject = Character.valueOf( (char)((Long)longobject).longValue() );
// (char)(long)longobject;
Integer intobject = (int)(long)longobject;Végülis logikus: a wrapper osztályok (szinte) kizárólag a saját primitivjükkel átjárhatóak (boxing). És csak a primitivek alakíthatóak egymásba (casting), a nem öröklési viszonyban álló objectek nem. (Bár a Long-Object átalakítás szintén casting, ha mindent jól értettem.)
Gondolom, ez itt sokaknak nagyon alap szint; de én azért jól megszenvedtem vele, mire kiolvastam a tudományból, hogy pontosan mi is kell ide meg hogyan működik...
-
thon73
tag
A Long Object "lebutítását" csak így tudtam megoldani:
Object result = getLongValue();
result = (long) result & (long) Character.MAX_VALUE;Működni működik, csak nem tűnik túl szépnek.
Viszont egy lépéssel később megint elakadtam. A "lebutított" értéket át is szeretném pakolni egy másik wrapper osztályba. ((Egy univerzális feldolgozó Object-ként kapja meg az értékeket ((Long a numerikus és String a Stringek számára), és különböző átalakítások, ellenőrzések után ezt kellene visszaadnia, csak éppen a kívánt méretnek megfelelő wrapper osztályba helyezve. Pl. Objekctként numerikus Long érték -> Objectként numerikus Character érték.))
Hogyan tudok egy Objectet, ami bizonyosan egy Long értéket tartalmaz, a lehető legegyszerűbben egy olyan Object-té alakítani, ami Character-t tartalmaz? ((A fordító vagy feleslegesnek látja a próbálkozásaimat, vagy hibaüzenetekkel bombáz.))
-
jetarko
csendes tag
Hogyan lehet levizsgálni azt h pl 10 táblán keresztül legyen egy érték unique?
Pl: minden táblában van e-mail, de mindenhol unique-nak kell lennie az egész db-t nézve.
Jelenleg úgy oldottam meg, hogy minden dao-nál az addNewXY esetén levizsgálom az összes táblát, hogy van-e ilyen érték és ha igen dobok egy exceptiont. UpdateXY esetén ugyanez csak ott ha már van ilyen vizsgálom, hogy ahhoz tartozik-e aki updatel. Ez 10 külön dao-nál elég macerás, és ha jön egy 11. akkor mindenhol bővíthetem.Másik: Ha olyan adatot akarok lementeni ami db szigorítás szerint nem valid, pl unique, akkor kapok egy ConstraintViolationException-t, de ebből nem tudom kitalálni, hogy konkrétan mire kaptam ezt az exceptiont.
Olyan adatot nem engedek el db szintig amit validatorral kitudok szűrni, de ez nem minden.Ezekre mi a best practice?
-
bucsupeti
senior tag
válasz
PumpkinSeed #6973 üzenetére
én csinalnek efy diszpecser osztalyt ahova be lehet regisztralni a konyvtar objektumokat valamilyen konténerben tarolva:
List<Konyvtar> konvtarak = new ArrayList()
Ennek a diszpecser osztalynak lenne egy swapBooks() metodusa ami lezongorazna a cseret ugy hogy a konyvtarak sajat metodusait hivogatna.
A Konyvtar osztalynak a cseret metodusokkal kell tamogatnia. Tudni kell kezdemenyezni a cseret, valaszolni egy csere kerelemre befogadni a cserebe kapott konyvet, kiadni a cserebe adott konyvet.
a cseret a diszpecser osztaly bonyolitja le akinek a szabalyait elfogadja minden regisztralo konyvtar. ezzel biztosithato hogy a cserek "becsuletesen" fognak lezajlani.
a pelda kapcsan inkabb az oo elvek megertesere alkalmazasara torekedj ugyanis az a lenyege ennek a feladatnak. ha nagyon profi akarsz lenni akkor tervezesi mintakat is bele lehet szoni...
-
Ursache
senior tag
válasz
PumpkinSeed #6975 üzenetére
List<Integer> lista1 = new ArrayList<>(); <- létrehoz egy lista objektumot a memóriában, majd ráállít egy referenciát lista1 néven, amelyen keresztül el tudod érni a lista objektumot.
List<Integer> lista2 = lista1; <- nem hoz létre egy új listát (sem egy vadonatújat, sem egy újat a lista1 elemeivel feltöltve), hanem az előzőleg létrehozott lista objektumra létrehoz még 1 referenciát, így két referenciád mutat a memória egyazon területére.
Konklúzió: bármelyik referencián keresztül is módosítod az objektumot, az a másik referencián keresztül is "látszódni" fog.
-
PumpkinSeed
addikt
válasz
Aethelstone #6974 üzenetére
Gyakorlatban itt a kód, hogy lehet ezeket a referenciákat megoldani? Még nem halottam róluk.
-
Aethelstone
addikt
válasz
PumpkinSeed #6973 üzenetére
Elvileg...
Az a lényeg, hogy ha minden könyvtár adhat mindenkinek, akkor legyen referencia első körben minden könyvtárhoz minden könyvtárban.
Aztán legyen minden könyvtárnak egy kap metódusa, amivel a könyvtár könyvet kap, visszatérési értékként meg egy másik könyv, amit ad érte.
Aztán minden könyvtárnak legyen egy ad metódusa, amivel könyvet ad. Ez a metódus hívja meg a másik könyvtár kap metódusát, a visszatérési könyvet meg berakja a saját könyvei közé.
Kb.
Persze, ha tömb (inkább valami lista), akkor nyilván figyelni kell olyasmikre, hogy amelyik könyvet adja, annak a helyére kerüljön az, amit kap...stb.
-
PumpkinSeed
addikt
Olyan kérdésem lenne, hogy adott egy Konyvtar osztály és egy Konyv osztály. A Konyv osztályban vannak szerző, cím stb. adattagok. A Konyvtar-ban a Konyv[] típusú tömbben tárolódnak a könyvek. A feladat az, hogy ha van két példányosított könyvtáram akkor tudjanak egymás között könyveket cserélni. Hogy lehet ezt megoldani? Elméletben hogyan csinálnátok meg? Semmi ötletem sincs, nem értem hogy tud két példány kommunikálni egymással.
-
Szmeby
tag
válasz
RexpecT #6966 üzenetére
DateTime now = new DateTime();
DateTime tomorrow = now.plusDays(1);
if (tomorrow.isAfter(now)) {
doIt();
}java.util.Date típusra ide-oda tud konvertálni is, ha szükséged van rá.
Vagy ha nem bírod a 3rd party librarykat, akkor java8 LocalDateTime?
LocalDateTime.from(new Date().toInstant()).plusDays(1);
Rengeteget szívhatsz a másodpercek babrálásával. Az, hogy 1 óra 3600 másodperc, pont annyira igaz, mint hogy egy év 365 nap... vagy mint fentebb, hogy 1 nap 24 óra. Általában igaz, kivéve a kivételek esetén.
A daylight-savig csak egy a sok hülyeség közül. Vannak szökőévek, elcsalt másodpercek, időzónák, saját elcseszett DLS megoldásokkal, borzalom.
Javaslom a jodát, hasznos kis eszköz. -
axioma
veterán
válasz
RexpecT #6969 üzenetére
1. ha csak napi 1x kell akkor nem tok mind1, hogy telen 7-kor nyaron 6-kor?
2. ha nem mindegy, akkor is ugy csinalnam, hogy utolso futasi idohoz az altalam irt modon adok 1 napot, es ahhoz hasonlitok -- mert ez fgtl attol, hogy esetleg milyen egyeb valtoztatasok lesznek a naptarban (en ugy 30 evvel ezelott gyerekkent az azt hiszem Furkesz c. gyerekmusorban lattam a jovo naptarat, amit mar akkor jelentos mennyisegu orszag elfogadott, ehhez kepest arrol sincs azota se semmi -- a munkaltatok es konyvelok a'lma, minden negyedev tok azonos 31-30-30 honapokkal es mindig hetfovel kezdodik stb.)
3. a daylight saving ma mar a jelentos mernoki munka miatt amit az ilyen esetekre koltenek mar ossztarsadalmilag boven negativ egyenlegu... -
RexpecT
addikt
A két paraméter amit átadok az aktuális futási időpontot tartalmazó Date Object, illetve a legutóbbi futási időt tartalmazó Date.
Jelen pillanatban naponta 1× kell futnia a proginak, amit úgy nézek meg, hogy az előző futásidőhöz hozzáadok 86400 *1000 millisecet. Ha az így előállt Date utána van a futáskor létrehozott Datenek akkor lefut egy metódus.
Itt csak az a baj, hogy ha 23 óra egy nap akkor (86400-3600)*1000 millisecet kellene hozzáadnom, ha pedig 25 óra egy nap akkor (86400+3600)*1000 millisecet kell hozzáadnom az előző futási időhöz.( mert egyébként +/- 1 órával változni fog a futáskori idő).
-
axioma
veterán
válasz
RexpecT #6966 üzenetére
En lehet hogy forditva csinalnam... nem kovetkeztetni a hossz modositasara, hanem az aktualis datumot visszabontani datumra es idore, datumbol 1 levon (az mar csak egyszerubb, me'g ha honaphataron is van), az idovel egyutt vissza long-ra, es az a tartomany eleje. Ha jol ertem, hogy mit akarsz csinalni (azaz a mai 7:00am lefuttataskor az a lenyeg, hogy a tegnapi - helyi ido szerinti - 7:00am ota eltelt idoszakba beleesest akarod tesztelni).
-
RexpecT
addikt
Sziasztok!
Van egy service progim, ami időnként meghívódik és megnézi hogy az aktuális idő később van-e mint egy fájlban letárolt dátum + intervallum millisecundumban.
Ez mind szép és jó, de van egy évben 1-1 nap mikor 23 illetve 25 órás egy nap. Ilyenkor a program egy órával hamarabb vagy később fut le. Ettől tudtok szebb/jobb/okosabb megoldást, hogy az intervallumot eltoljam?
public int change(Date today, Date yesterday){
Calendar todayCal = Calendar.getInstance();
todayCal.setTime(today);
Calendar yesterdayCal = Calendar.getInstance();
yesterdayCal.setTime(yesterday);
boolean todayInDayLightTime = todayCal.getTimeZone().inDaylightTime(today);
boolean yesterdayInDayLightTime = yesterdayCal.getTimeZone().inDaylightTime(yesterday);
System.out.println("Yesterday DaylightTime: " + (yesterdayInDayLightTime==true?"Nyari idoszamitas":"Teli idoszamitas"));
System.out.println("Today DaylightTime: " + (todayInDayLightTime==true?"Nyari idoszamitas":"Teli idoszamitas"));
if(yesterdayInDayLightTime == true && todayInDayLightTime == false){
System.out.println("Óra visszallitas -3600");
return -3600;
}
else if(yesterdayInDayLightTime == false && todayInDayLightTime == true){
System.out.println("Óra eloreallitas +3600");
return +3600;
}
else{
System.out.println("Nem történt oraatallitas!");
return 0;
}
} -
Sk8erPeter
nagyúr
válasz
#92700160 #6963 üzenetére
Nem egy mai csirke az a gép, egy SSD beszerzése, és némi RAM-bővítés egészen biztos, hogy dobni fog a felhasználói élményen, már ha nem érné meg új gépet venni. Az SSD-nek persze van egy olyan előnye, hogy azt át tudod vinni másik gépbe is, tehát az mindenképpen megérné. Tapasztalatból tudom, milyen ugyanaz a gép, amikor HDD-n van minden, és elindítod a NetBeans-t vagy Eclipse-et rengeteg megnyitott projekttel, és milyen az, amikor átkerül az egész SSD-re, brutális a különbség utóbbi javára, jópár hajszállal több marad a fejeden. Ilyenkor az elején ugye végigfutkorászik a projekteken, nem mindegy, milyen olvasási sebességgel kotorászik (meg hát nyilván az írási sebesség sem mindegy).
Egyébként tényleg eléggé OFF-topic. -
#92700160
törölt tag
Sziasztok!
Elég topichatáron mozog a kérdésem, lehet nem ez a legmegfelelőbb hely rá.
Szóval van egy C2D t5750 (2ghz dual core, 2mb l2 cache), 2 gb ddr2 rammal. Namost kedves netbeans szereti a ramot. Elég sokszor produkál random halálokat, ilyen 1-3 mp-re megáll az élet, meg amikor background projecteket scannel, eléggé unresponsive lesz a gép.
Namost 5 hónapja kezdtem a javát, szóval nem fogok trillio .java-t buildelni, az még odébb van.
Ha bővítek ramot, az megoldaná a problémákat, vagy cpu lesz a szűk keresztmetszet, és inkább ne költsek erre a laptopra és vegyek új konfigot, amikor lesz rá keret?
-
Sziasztok! Tudom, hogy kicsit gyökér kérdés, de hogy a pitlibe tudok egy jar filet futtani win8.1-en? Eclipseben megírtam az alkalmazást, sima java projectként. Utána exportáltam jar fileként. No ha erre a filera kattintok nem történik semmiPedig ha az eclipseből futtatom akkor működik az alkalmazás tökéletesen.
szerk.: én voltam a gyökér, nem futtatható jar filet csináltam
-
Ursache
senior tag
válasz
PumpkinSeed #6958 üzenetére
Az a konyv tokeletes!
Ez enum pont az ilyen fajta problemakra ad megoldast. Nem nehez megerteni, megtanulni. Nekem is volt, hogy boolean-okkal, aztan amikor kettonel tobb allapotot kellett leirnom, akkor int-ekkel heggesztettem. A boolean nem erre valo, az int sem kifejezetten, azt meg akar hibakodora lehet, de allapot leirasokra, meg ilyen jellegu problemakra enum. Hajra!
-
Ursache
senior tag
válasz
PumpkinSeed #6955 üzenetére
Csak egy megjegyzes: konvencio, hogy a final kulcsszoval ellatott konstansok neveit csupa nagybetukkel kell irni.
Tovabba gondolom a boolean tipus parameter donti el az eljarason belul, hogy most tartolaprol avagy hatlaprol van-e szo. Erre enum-ot hasznalj.
+ az osztalyok nevei mindig nahybetuvel kezdodnek, ahogyan a kollega is irja.
Ezek talan a legszembetunoek. Olvass utana a clean coding-nak es a konvencioknak. Nem csak masoknak, hanem magadon is segitesz ezzel.
-
PumpkinSeed
addikt
válasz
WonderCSabo #6954 üzenetére
Így működik köszönöm. A feladatban így kellett meghatározni a tömböt, csak én máshogy csináltam meg a hozzaAd metódust és elfeledkeztem róla.
-
WonderCSabo
félisten
válasz
PumpkinSeed #6953 üzenetére
Ha jól látom azért kapsz NPE-t, mert a butor tömbben null-ok csücsülnek. A hozzaAd metódusban csak az utolsó elem lesz nem null, a többi mind null marad. Ezt megoldhatnád úgy, hogy kezdetben 0 méretű tömböt készítesz:
this.butor = new butorlap[0];
-
Ursache
senior tag
válasz
PumpkinSeed #6951 üzenetére
Most lehet nem jól értelmezem a kérdést, de egyszerűen definiálsz egy public int árSzámol() {} eljárást a bútorlap osztályban, és a tömbön végigiterálsz, ahogy csinálod is ( gondolom az a bútor osztályodban lévő árSzámol() ), és csak egyszerűen hívogatod az árSzámol() eljárást minden bútorlapra.
-
PumpkinSeed
addikt
Van két osztályom egy bútor és egy bútorlap. A bútorlap három adattaggal dolgozik. A bútor kettővel és az egyiknek bútorlap adattípusa van és egy tömb. A bútorlap osztályban van egy árSzámol() metódus ami hát kiszámolja a bútorlap árát. A bútor-ban tárolva vannak a bútorlapok a tömbben és hogyan tudom meghívni a bútorlapban lévő árSzámol metódust, hogy azt egy sum változóhoz minden for ciklus iterációban visszaadja. Eddig jutottam.
public int arSzamol(){
int sum = 0;
for(int i=0; i < butor.length;i++){
sum = sum + butor[i].arSzamol();
}
return sum;
} -
thon73
tag
válasz
WonderCSabo #6940 üzenetére
Közben eddig jutottam:
Object result = null;
...
result = getPrimitiveLong(); // long visszatérési érték
// másutt
result = getLong(); // Long visszatérési érték
...
result = (long)result & 0xFFFFFFFFL;Ha itt (Long)-ot írok a (long) helyett, az hülyeség? Aritmetikai műveletet csak primitivek csinálnak? És ezt: &=, gondolom, felejtsem el.
Egyébként a fenti jó.Amikor viszont ezt írom:
result = (long)result & Character.MAX_VALUE;
Akkor azt mondja, hogy "Reports pointless bitwise expressions..."
Ez miért van? Nem long-ra alakít mindent, ha az egyik long??Bocs, hogy ennyit kérdezek, de wrapper osztályt idáig tényleg csak wrapper-ként használtam, és nem dolgoztam vele.
-
válasz
WonderCSabo #6946 üzenetére
tru dat
-
fatal`
titán
válasz
WonderCSabo #6943 üzenetére
Szerintem az is ezt csinálja. Azért ajánlottam a ciklust, mert így tudja formázni is az elemeket, ha nem csak simán kiírni akarja, hanem esetleg plusz adatot belefűzni, akkor később jobb lehet.
-
zolka95
őstag
Egy tömb összes elemét hogy kell kiíratni?
-
thon73
tag
Sziasztok!
Elakadtam egy arithmetikai problémával:
Egy érték egyaránt lehet String vagy különböző pontosságú numerikus érték, ezért Object-ként tárolom. (A program egyébként tudja, hogy melyik van benne.)
Tegyük fel, hogy egy long pontosságú szám van benne, amit szeretnék char pontosságúra korlátozni. (Csak az alsó bitek érdekesek.)
Primitív típussal ezt tenném:
value &= Character.MAX_VALUE;
De hogyan tudom ezt egy wrapper-rel elérni, pláne úgy, hogy Object-ként van definiálva eredetileg?
((Az autoboxingnál azt olvastam, hogy lehet ilyet, de nem sikerült.))
Köszönöm! -
Apollo17hu
őstag
Sziasztok!
Nem programozás, de mit tudok tenni, ha egy oldalon a Java biztonsági beállításai miatt nem indul el a javás alkalmazás?
Megnéztem a biztonsági beállításokat: Very High és High közül lehet választani, nálam az utóbbi van. Nem lehet még alacsonyabbra venni? Mit tudok tenni?
-
válasz
Aethelstone #6935 üzenetére
Termeszetesen arra a helyzetre gondolok, amikor az adott tipust nem tudod megvaltoztatni, mert pl. egy 3rd party libraryben van. Ugye ez az un. 'expression problem', azaz ha van
- N tipusod
- es M funkcionalitasod (fuggenyed)
(tehat van egy N*M-es matrixod, aminek minden elemet ki kell toltened).. akkor a klasszikus OOP nyelvekben konnyu uj tipust hozzaadni (barmikor implementalhatsz egy interfeszt), de nehez uj fuggvenyt hozzaadni (egy adott tipust nem biztos, hogy meg tudsz valtoztatni ugy, hogy implementaljon egy interfeszt). FP nyelvekben konnyu uj funkciot hozzaadni, de nehez uj tipust hozzaadni (mert meg kell valtoztani az osszes letezo fuggvenyt). Aztan persze van nyelv, ahol mindketto egyszeru.
@Wondercsabo: okes, csak megemlitettem.
-
WonderCSabo
félisten
Ezekkel tisztában vagyok. Csak azt mondom, hogy az eredeti problémát így meg lehet oldani.
-
válasz
WonderCSabo #6929 üzenetére
Csak epp van egy fuggvenyed, aminek oriasi overheadje van.
A masik problema, hogy meglevo tipusokat nem tudsz adaptalni, ergo ha van egy fuggveny, ami T extends Comparable<T>-t var, es van egy tipusod, ami nem implementalja a Comparable<T>-t, pedig te tudod, hogy ossze lehetne hasonlitani a peldanyait egymassal, akkor korbe kell hekkelni, hogy mukodjon...
-
WonderCSabo
félisten
válasz
Aethelstone #6930 üzenetére
Nem is akarok.
-
Aethelstone
addikt
válasz
WonderCSabo #6929 üzenetére
Persze, csak a példányosításnál nem tudsz <int>, satöbbi típust megadni...
-
WonderCSabo
félisten
válasz
Aethelstone #6927 üzenetére
Kivéve természetesen a primitív típusokat, azokat a generikusok nem támogatják
De szerencsére van autoboxing, emiatt ugyanúgy fog működni, ha primitíveket adsz át neki.
-
Sk8erPeter
nagyúr
válasz
Tibcsi55555 #6926 üzenetére
Ez a kérdés eltévedt.
-
Aethelstone
addikt
válasz
geckowize #6921 üzenetére
Vagy ilyet is lehet, ha már a generikusokra rákérdeztél. Ez viszont működik explicit típusokkal is.
(Természetesen a korábban vázolt megoldások tejesen jók)
public class GenericTest<T extends Comparable<T>> {
public T max(T a, T b) {
return (a.compareTo(b) > 0 ? a : b);
}
public static void main(String[] args) {
GenericTest<Double> gt1 = new GenericTest<Double>();
System.out.println(gt1.max(10d, 12d));
GenericTest<Integer> gt2 = new GenericTest<Integer>();
System.out.println(gt2.max(12, 23));
// És így tovább....
}
}Ennek a megoldásnak az az előnye, hogy tulajdonképpen mindenféle típusra lehet max() metódust írni. Kivéve természetesen a primitív típusokat, azokat a generikusok nem támogatják
-
Tibcsi55555
tag
Sziasztok,
Segítséget szeretnék kérni hogy hogyan tudok olyat készíteni hogy egy pop-up window-ban egy kép jelenjen meg hover text alatt ? Vagyis ha ráhúzom az egeret a szövegre, akkor egy kis ablakban jelenjen meg egy kép. Viszont ez az ablak ne törje szét az oldalt, vagyis valami féle popup legyen.
Próbálkozom sok mindennel, de egyszerűen nem sikerül.
Üdv, -
Szmeby
tag
válasz
geckowize #6923 üzenetére
Na igen. Ha kényszeríted, nem adja meg magát.
Bezzeg így:
byte x = 3;
byte y = 5;
byte a = (byte) maxObject.max(x,y);
System.out.println(a);Az oké, hogy a paraméterek mind elférnek a double által lefoglalt területen, viszont így kénytelen vagy double típust visszaadni. A double értéket viszont csak double típusú változóba tudsz beletölteni hiánytalanul.
Ha lefelé castolod (pl. byte-ra), akkor információ veszhet el.
Egy nagy vödörből nem tudod az összes vizet áttölteni egy kis vödörbe. Viszont ha a nagy vödörben eleve kevés víz van, és ezt tudod is, akkor az áttöltés veszteség nélkül megoldható. Bocs a hülye metaforáért.Bár gányolásnak tartom, de ennél a példánál (két szám maximumát adja vissza) nincs túl nagy veszély. A programozó józanságára van bízva, hogy ha byte-okat ad be, akkor byte-ot biztonságosan visszakaphat. Ha az egyik int lenne, de az érték nem változna, még az is oké. Viszont ha az int értéke pl. 300, akkor gáz van, mert az nem fér bele a byte-ba.
De még 2 byte paraméternél is lehet gond, ha nem maximumot ad vissza a metódus, hanem az összegüket. Bár ez double esetén is gond, ha elegendően nagy számokkal dolgozol.
Amúgy azért nem szeretem ezt, mert figyelmetlenségből is könnyű rontani, ami egy nagy alkalmazásnál aranyos bugokat szül. -
geckowize
őstag
válasz
WonderCSabo #6922 üzenetére
Ezt már kipróbáltam, viszont a main-ben probléma van:
public static void main(String[] args) {
final Compare maxObject = new Compare();
final byte a = maxObject.max((byte) 3, (byte) 5);
System.out.println(a);
final short b = maxObject.max((short) 3, (short) 5);
System.out.println(b);
final int c = maxObject.max(3, 5);
System.out.println(c);
final long d = maxObject.max(3L, 5L);
System.out.println(d);
final float e = maxObject.max(3.4f, 5.1f);
System.out.println(e);
final double f = maxObject.max(3.4, 5.1);
System.out.println(f);
final char g = maxObject.max('a', 'b');
System.out.println(g);
}A double-ösön kívül aláhúzza mindegyiket a maxObject-től a sor végéig, "Type mismatch: Cannot convert double to <éppen aktuális típus>" jelzéssel.
-
-
geckowize
őstag
válasz
geckowize #6867 üzenetére
Sziasztok,
újabb feladathoz értem, ahol elakadtam.
Az alábbi Comapre osztályban minden max metódus azonos, kivéve a típusok neveit. LEhetséges lenne egyetlen max metódussal valamennyit helyettesíteni? Ha igen, akkor melyik megoldást használná?
public class Compare {
public byte max(final byte a, final byte b) {
return a > b ? a : b;
}
public short max(final short a, final short b) {
return a > b ? a : b;
}
public int max(final int a, final int b) {
return a > b ? a : b;
}
public long max(final long a, final long b) {
return a > b ? a : b;
}
public float max(final float a, final float b) {
return a > b ? a : b;
}
public double max(final double a, final double b) {
return a > b ? a : b;
}
public char max(final char a, final char b) {
return a > b ? a : b;
}
}Mire gondolhat, ha a könyvben még nem taglalta a generalizáció fogalmát, a generikus függvényeket? Egyelőre amik voltak: Procedurális nyelvi elemek, OO nyelvi elemek (osztályok, öröklés, beágyazott osztályok).
-
DNReNTi
őstag
válasz
Aethelstone #6919 üzenetére
Hagyom így öt szálon, így is perfekt.
Köszi azért.
-
DNReNTi
őstag
válasz
Aethelstone #6916 üzenetére
No erre nem találtam rá, de megtaláltam rajta keresztül a megoldást. Kipróbáltam, most úgy tűnik működik, pár órára így hagyom, ha nem dől be akkor király. Köszi!
-
Aethelstone
addikt
-
DNReNTi
őstag
Sziasztok,
Selenium tesztet szeretnék futtatni párhuzamosan több szálon Chrome-ban. A dolog kiválóan működik 5 szálig, de ha mondjuk 10-et indítok, akkor pár perc alatt meghal 5 böngésző a 10-ből JavaSocket Exception-nel:
"No buffer space available (maximum connections reached?)"Találtam rá infót, hogy ez a Windows 7 egy hibájának tudható be, van rá hotfix, de nekem nem javult meg tőle.
Windows7, JDK 8.31, Selenium 2.44 (próbáltam korábbival is, ugyan ez).Tapasztalt valaki hasonlót? Nem nagy gond egyébként, elég az 5 szál is bőven, csak kíváncsi vagyok mi az oka, mit rontok el? Köszi!
Szerk: typo
-
moriak
tag
Konzolon hiba nem volt, tomcat hiba nem volt és most ott tartok, hogy az api-docs URL-re 404-et kapok.
Loggerben a level fejlesztés alatt ALL-on van, kilistázza az összes requestet végég a 2db api-docs URL-el.
Majd fut a swagger és megint kilistázódik az összes request viszont már az api-docs-os url-ek nélkül és így lesz belőle 404! -
moriak
tag
KERES: springhez rest api dokumentum generátor. tudom, tudom... ne kövezzetek meg, előre kell dokumentációt írni!
swaggert húztam be, de nem akarja az igazságot. köszi -
Szmeby
tag
Úgy néz ki, sikerül megpatkolni. A jetty által system class-ként alapértelmezetten beállított cuccokat kicsaptam.
webapp.setSystemClasses(new String[0]);
Így minden class a webappok saját classloaderével töltődik be, még a RuntimeDelegate singletonból is készül 1-1 példány a webappokban. A PermGen szépen megugrott ennek hatására.
Kicsit pazarló, és talán drasztikus lépés, de úgy tűnik most működik. Még kicsit játszok vele.Az kavart meg, hogy a RuntimeDelegate javaxos package-ben volt, míg a resteasy-s leszármazottai org.jboss... package-ben voltak. Kiderült, hogy a RuntimeDelegate IS a resteasy része. Abban a hitben voltam a package alapján, hogy ez valami jdk-s cucc. És mivel a default jetty beállítások miatt ez a system classloaderrel töltődött be, meg sem fordult a fejemben, hogy ez a resteasy libből jön.
-
Szmeby
tag
válasz
Lortech #6899 üzenetére
Hm. Nem rémlik, hogy ezt próbáltam volna. Köszi a tippet, holnap teszek egy próbát.
Én a másik irányba mozdultam el, hozzáadtam a resteasy cuccait is system classként. Sajnos akkor máshol ütötte fel a fejét a ClassCastException. Végül sikerült elérnem, hogy már el sem indult a cucc.
Vagy azt a custom classloader okozta, már nem emélkszem. -
floatr
veterán
Azért mert a tömbváltozó által megcímzett területen módosítasz, ami metóduson kívül és belül is ugyanaz marad. Viszont amikor a tömbváltozót nullázod ki, megint belefutsz ugyanabba a problémába, hogy a paraméter mint változó csak a másolata az eredeti változónak, ami referencia. Na
Jobban nem fogom tudni elmagyarázni
-
Pont az a lenyeg, hogy MINDIG ertek szerint adodnak at a parameterek. Az int[] erteke egy referencia, ami egy tombre mutat. cc eseten atadod a referenciat, ami tombre mutat, aztan azt a tombot, ahova az mutat, megvaltoztatod (pontosabban az egyik elemet). dd-ben szinten a referenciat adod at ertek szerint, aztan azt a referenciat kinullazod. Az eredeti tombbel semmi nem tortenik.
Szoval erdemes jol megjegyezni: Javaban MINDIG ertek szerinti parameteratadas tortenik, es az atadhato ertekek tipusa lehet int, boolean, double, egyeb primitivek es referencia.
Új hozzászólás Aktív témák
Hirdetés
A topicot kiemeltem. Valaki nem akar egy nyitó hsz-t írni?:))
- Lakáshitel, lakásvásárlás
- Építő/felújító topik
- PROHARDVER! feedback: bugok, problémák, ötletek
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Léghűtés topik
- Revolut
- Honor Magic5 Pro - kamerák bűvöletében
- Synology NAS
- Autós topik
- Kaposvár és környéke adok-veszek-beszélgetek
- További aktív témák...
- BESZÁMÍTÁS! ÚJ AMD Ryzen 5600X 5700X 5800X 5900X processzor 3 év garancia 27% áfa termékbeszámítás
- BESZÁMÍTÁS! ÚJ AMD Ryzen 8500G / 8600G AMD Ryzen 7 8700G / 7800X3D processzor 3 év garancia 27% áfa
- Remek áron Lenovo ThinkPad x395 AMD Ryzen 7 pro-3700U/16GB/256 SSD/AMD Radeon Vega 10 Grap/FHD/IPS
- MacBook Air M1 8/256 92% Aksi szép állapotban
- iPhone 12 Pro Max 128GB Újszerű Független/1-3 hónap gar./Akku 86%/p4360
- BESZÁMÍTÁS! Acer Predator Helios 300 Gamer notebook - i7 10750H 16GB DDR4 1TB SSD RTX 2060 6GB WIN10
- Dell USB-C dokkolók: (K20A) WD19/ WD19S/ WD19DC + 130W, 180W, 240W töltők
- Honor Magic5 Lite 128GB, Kártyafüggetlen, 1 Év Garanciával
- 3DKRAFT.HU - 3D NYOMTATÁS - AZONNALI ÁRAJÁNLAT - GYORS KIVITELEZÉS - 480+ POZITÍV ÉRTÉKELÉS
- Bomba ár! Dell Precision M4600 - i7-QM I 8GB I 500GB I Nvidia I HDMI I 15,6" FHD I W10 I Gari!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest