A szakember becslése az, hogy a jelenleg tervezett munkálatokkal, illetve azok tesztelésével és a szükséges utómunkálatokkal nagyjából 2012 közepére készülnének el. Felvázolta, hogy jelenleg két terv áll rendelkezésre:
A terv:
JDK 7 (a jelenleg tervezett formájában) - 2012 közepe
B terv:
JDK 7 (a Lambda, Jigsaw és a Coin bizonyos része nélkül) - 2011 közepe
JDK 8 (ami 7-esből kimaradt) - 2012 vége
Reinhold tájékoztatása szerint az Oracle-nál jelenleg a kevesebb kockázattal járó B tervet preferálják.
A blogbejegyzés elolvasható itt.
- A hozzászóláshoz be kell jelentkezni
- 5075 megtekintés
Hozzászólások
Miért kevesebb a kockázat a B verzió esetében? Mert egy félévvel később fejeződik be?
Akkor inkább legyen az A terv és adjanak neki egy félévvel több időt. Nekem jobban tetszik, mert ez esetben nem kell két év alatt kétszer verziót váltani, hogy ugyanoda érjünk el.
--
Tertilla; Tisztelem a botladozó embert és nem rokonszenvezem a tökéletessel! Hagyd már abba és kész!
- A hozzászóláshoz be kell jelentkezni
A probléma az, hogy a jelenlegi ütemtervek szerint a Java 6 EOL idén decemberben következik be és Java 7 még sehol nincs. Az A terv szerint legalább két évvel kell kitolni a Java 6 EOL idejét, amely akkor 6 éves lesz. A B terv szerint elég egy évvel, és akkor csak 5 éves lesz a Java 6.
A legnagyobb probléma az, hogy túl nagyot álmodtak a válság előtt, most pedig nehéz visszavenni az arcméretből, pedig az Oracle arcmérete bőven nagyobb, mint amennyit a termékei minősége alapján saccolna az ember... :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Nem hinném h a gyorsan kiadott félmegoldások jelentenék megoldást, inkább várjanak fél évet még és adják ki az egészet egybe, a lényeg úgyis az hogy minnél kevesebbszer kelljen újraírni vagy újratanulni a nyelvet. Én az A tervet pártolom, de nem zavarna ha csúszna, csak rendes munkát végezzenek.
- A hozzászóláshoz be kell jelentkezni
A Lambda es a Jigsaw meg ertheto, de a Coin szetdrabolasa mar kevesbe. Szvsz a Lambda csusztatasa meg oke, de Jigsaw must have.
- A hozzászóláshoz be kell jelentkezni
Turkáltam kicsit az archivumban:
http://www.javaforum.hu/javaforum/0/action/news/news/60/action/news.Det…
http://www.javaforum.hu/javaforum/0/action/news/news/64/action/news.Det…
http://www.javaforum.hu/javaforum/0/action/news/news/39/action/news.Det…
http://www.javaforum.hu/javaforum/0/action/news/news/42/action/news.Det…
http://www.javaforum.hu/javaforum/0/action/news/news/42/action/news.Det…
2012 messze van... :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Most mondhatnám, hogy szarból nem lehet várat építeni, de mivel nagyon sokan laknak szarvárban, azt hiszem nem valid... és a szar szar marad akkor is, ha fűszert raknak bele :D
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Én is a B tervet támogatom. Egyébként már holnap kezdődik a JavaOne, szóval remélem hamarosan még több információt kapunk.
- A hozzászóláshoz be kell jelentkezni
+1. Én is inkább a B megoldást támogatom. A kimaradók közül nekem inkább a Lambda hiányozna.
A minél hamarabbi megjelenés számunkra azért is fontosabb, mert az ügyfeleink az új Java-k bevezetését csak a megjelenésük után legalább 1 évvel később engedélyezik.
Ha viszont a Scala kicsit nagyobb támogatást kapna, akkor akár örökre is bezárhatnák a Java fejlesztését, mert mint nyelv a Scala szerintem fényévekkel jobb.
- A hozzászóláshoz be kell jelentkezni
"mint nyelv a Scala szerintem fényévekkel jobb"
Miben jobb?
- A hozzászóláshoz be kell jelentkezni
+1, ez engem is érdekelne. Párszor már nekifutottam a scala nyelvnek (korábban tanultam sml-t, prolog-ot is), de nem igazán láttam benne azt, hogy ettől mitől lehetne jobb programokat írni. Ugyanez volt az SML/prolog-gal is az érzésem: néhány marginális feladatra nagyon jó, az átlag fejlesztésre egyáltalán nem.
- A hozzászóláshoz be kell jelentkezni
• It has an event-based concurrency model.
• It supports both an imperative style and a functional style.
• It is purely object-oriented.
• It intermixes well with Java (and .Net).
• It enforces sensible static typing.
• It is concise and expressive.
• It is built on a small kernel.
• It is highly scalable, and it takes less code to create high-performing applications.
Aki szereti a Java-t és szereti a C++-t is, az különösen kedvelheti a Scala-t is. Pl. itt is van operator overloading (még ha nem is az, de úgy néz ki).
Ha nem ismered érdemes rápillantani!
Egy példát azért írok.
Ez a scala kód:
class CreditCard(val number: Int, var creditLimit: Int)
Fordítás után olyan, mintha ezt írtuk volna Java-ban:
public class CreditCard extends java.lang.Object implements scala.ScalaObject{
private int creditLimit;
private final int number;
public CreditCard(int, int);
public void creditLimit_$eq(int);
public int creditLimit();
public int number();
public int $tag() throws java.rmi.RemoteException;
}
Szerk.: rövid utazás a Scala körül.
- A hozzászóláshoz be kell jelentkezni
class CreditCard
{
public int Number { get; set; }
public int Limit { get; }
}
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
ez mintha tervben lett volna a jdk7-hez?
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy volt tervezve, de én most nem látom még a tervek között sem.
- A hozzászóláshoz be kell jelentkezni
Ez a C# 3-ban van.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Valami linket tudsz adni, hogy honnan vetted ezt a formát?
- A hozzászóláshoz be kell jelentkezni
Szerintem C# kódot írt ide.
- A hozzászóláshoz be kell jelentkezni
Minek amugy setter? Konstruktorban beallitod az erteket, aztan ha nem kell az objektum, eldobod. Egy objektum publikus allapota csak az objektum altal legyen valtoztathato, meg a konstruktor altal. Semmi koze a tobbi objektumnak az objektum publikus allapotahoz, ne akarja beallitani. Majd beall az magatol. Vagy ha nem valtozik soha, lehet final.
- A hozzászóláshoz be kell jelentkezni
Itt két dolog egy kicsit keverve van.
Egy objektum vagy mutable (változtatható) vagy immutable (nem változtatható).
Ha immutable (final) az objektum, akkor nyilván nincs szükség setterre. Általában ez a forma javasolt a legtöbb esetben, mert sokkal kevesebb hiba lehet és könnyebb ellenőrizni a helyességét.
Ha mutable, akkor viszont a setter is ugyanolyan metódus, akár a többi, ami állítja az állapotát. A setter hívásával sem biztos, hogy felveszi azt az állapotot az objektum, függhet a beállítás az objektum korábbi állapotától, a paramétertől, bármitől. Az objektum állapota nem "Magától" állítódik, hanem egy külső hívástól, hogy a hívott metódust hogy hívják (set, change, add, ...) az édes mindegy.
- A hozzászóláshoz be kell jelentkezni
Mutable objektumok eseteben a setterek inkabb mar metodushivasok, mint sima allapotbeallito dolgok, hiszen mint ahogy irtad is, az, hogy egyaltalan mikent valtozik az allapot, az fugg az objektum jelenlegi allapotatol, a parameterektol stb. Ez ugye igazabol a constrained propertyk eseteben jon elo, a simple propertyknal nem. De ettol fuggetlenul kodban az a jo, ha a belso member valtozokat az objektum allitja be mindig (azaz nincsenek simple property setterek), mert igy egy helyen kell debugolni a kodot. Na meg a masik alapelv, hogy egy metodus mindig csak egy objektum allapotat modositsa: vagy amit megkap parameterben, vagy onmagat. Sokkal konnyebben debugolhato es kezelheto a kod, ha betartjuk ezt az elvet.
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Én ismerem a Scalat nem azért kérdeztem, hogy szerinted miért jobb.
"It has an event-based concurrency model."
Ez csak api kérdése szerintem. Concurrency libből meg annyi van, hogy Dunát lehetne rekeszteni vele. Vagy másképp: nekem nincs gondom a Java saját concurrency kezelésével.
"It supports both an imperative style and a functional style."
Ez nem biztos, hogy pozitívum.
"It is purely object-oriented."
Java is.
"It intermixes well with Java (and .Net)."
Ez nem különbség a Javahoz képest. Másrészt tudtommal a Scala .Net portja eléggé outdated.
"It enforces sensible static typing."
Java is.
"It is concise and expressive.
It is built on a small kernel.
It is highly scalable, and it takes less code to create high-performing applications."
Hát ez így csak marketing. Vagy mondhatni: Java is.
"van operator overloading"
Mondanál egy példát, ahol te hasznosabbnak tartod az operator overloadingos megoldást egy OOP megoldás helyett?
"Ez a scala kód:
class CreditCard(val number: Int, var creditLimit: Int)
Fordítás után olyan, mintha ezt írtuk volna Java-ban:
public class CreditCard extends java.lang.Object implements scala.ScalaObject{
private int creditLimit;
private final int number;
public CreditCard(int, int);
public void creditLimit_$eq(int);
public int creditLimit();
public int number();
public int $tag() throws java.rmi.RemoteException;
}"
Remek is lehet egy ilyen kódot debuggolni, ahol egy betűnyi eltérés van két, ugyanarra használható, de másképp működő foglalt szó között (val -><- var). Másrészt standard Java kódban egy Beanhez ilyen metódusok nem kellenek. Csak getter meg setter. Igaz ez boilerplate kódnak tűnhet, de Eclipse-ben alt+shift+s, r, enter azt generál nekem minden propertyhez.
Igazából ez az egyik nagy bajom a Scalaval, hogy tool támogatásban sehol nincs a Javahoz képest, másrészt meg nagyon lábonlővös nyelvi elemekkel van tele, amik csak syntactic sugar kategóriába esnek és csak arra jók, hogy az egységnyi sugarú programozók magukat és egymást szívassák vele egy projektben. A java ezzel szemben egyszerű, mert nincs benne sok syntactic sugar, azaz a legtöbb dolgot egyféleképpen lehet vele leprogramozni. Ez lehet, hogy kicsit szószátyár módon megy benne, de erre vannak eszközök, és így könnyebben érthető egy csapatban minden programozó számára a kód.
- A hozzászóláshoz be kell jelentkezni
"Mondanál egy példát, ahol te hasznosabbnak tartod az operator overloadingos megoldást egy OOP megoldás helyett?"
Ha úgy nézzük, az operatorok is metódusok, csak kérdés mennyire kifejező. Ha pl. van egy Vector3 osztályunk, amin viszonylag sok matematikai műveletet kell végezni.
"Csak getter meg setter."
Pedig mennyivel szebb és olvashatóbb egy property. Főleg, ha ki lehet optimalizálni, hogy ne egy teljes függvényhívást végezzen egy egyszerű, mezei adattag írásához/olvasásához.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Pedig mennyivel szebb és olvashatóbb egy property. Főleg, ha ki lehet optimalizálni, hogy ne egy teljes függvényhívást végezzen egy egyszerű, mezei adattag írásához/olvasásához.
A szebb és olvashatóbb dolog szubjektív, nekem valahogy jobban olvashatóbb a
x.setY(z);
mint az
x.y = z;
forma.
Az utóbbi esetén nem lehetek biztos benne, hogy a beállításkor fut-e le a validálás, vagy értesítődik-e a változásról egy observer. Az első esetben az a plusz információ megvan, hogy potenciálisan futni fog validálás, vagy történik valami változáskezelés.
Ha property kell Java nyelven, akkor arra ott a public a mezők elé private helyett.
A kioptimalizálás a JVM dolga, a programozó ne optimalizálgasson feleslegesen, főleg, ha nem is ért hozzá, mert sokszor több kárt csinál, mint hasznot. Ha a getter/setter a megszokott módon "üres", akkor nincs függvényhívás, CPU időben olyan, mintha értékadás történne. Érdemes elmélyedni néha a futásidejű és főleg a fordítási idejű optimalizálásokban... :)
Tegye fel a kézét aki tudta, hogy Java 5 óta a "a" + "a" + "a" jellegű forráskód StringBuilder összefűzéssé fordul, tehát felesleges kézzel beleírni a forrásba a csúnya és hosszú StringBuilder append hívásokat, ezt megteszi már a fordító is. És ezernyi ilyen apró trükk van, csak rá kell nézni a Java 6 közel 900 opciójára, amelyekkel a futásidejű (GC, memória, CPU, I/O, stb.) optimalizás módját és paramétereit lehet befolyásolni.
A Java nem csak arról szól, hogy egy nyelven programozunk, ez egy hatalmas és összetett platform... :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
ha tudtam, jar a csoki? :)
- A hozzászóláshoz be kell jelentkezni
En is tudtam. Nem nagy kunszt :D
- A hozzászóláshoz be kell jelentkezni
csokker ;))
--
Wir sind erfaßt, sind infiziert,
Jedes Gespräch wird kontrolliert.
- A hozzászóláshoz be kell jelentkezni
"Az utóbbi esetén nem lehetek biztos benne, hogy a beállításkor fut-e le a validálás, vagy értesítődik-e a változásról egy observer."
Akkor egy picit néz ki a Java világán túlra is.
private int_pozitiveNumber;
public int PozitiveNumber
{
get
{
return _pozitiveNumber;
}
set
{
if (value < 0)
{
throw new Exception();
}
_pozitiveNumber = value;
ValueChanged();
}
}
Értem én, hogy ez is két függvény lesz gyakorlatilag, azonban szemantikailag mást jelent egy értékadás és mást egy metódushívás.
Jelentéstartalom meg egyértelmű: belső adattagokat (C#-ban) kisbetűvel, propertyket, nagybetűvel szokás kezdeni, metódusok mögött meg egyébként is ott a zárójel. Ja és még az IDE is máshogy jelzi a listákban. (Igen, tudom, hogy más a Java-ban az elnevezési konvenciók).
Ellenben, mikor konzekvensen set/get/isAkarmi() -t használsz "propertyként", akkor se bízhatsz abban, hogy van mögötte bármiféle egyéb funkció. OOP egyik előnye az absztrakció: te csak annyit látsz kívülről, hogy az egy objektum tulajdonsága. Az, hogy belül mit csinál, az ilyen esetben lényegtelen.
"A kioptimalizálás a JVM dolga, a programozó ne optimalizálgasson feleslegesen, főleg, ha nem is ért hozzá, mert sokszor több kárt csinál, mint hasznot"
Ez a hozzáállás miatt nem képeznek már normális fejlesztőket, csak kódlapátolókat. "Minek tudjon bármit is, hisz úgy is megcsinálja a gép!"
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
"Ez a hozzáállás miatt nem képeznek már normális fejlesztőket, csak kódlapátolókat. "Minek tudjon bármit is, hisz úgy is megcsinálja a gép!""
Pedig ebben az esetben szerintem igaza van. Az ilyen alacsony szintű optimalizálás (tehát a függvényhívás elkerülése) már ha nem is a JVM, de a fordító dolga.
- A hozzászóláshoz be kell jelentkezni
Szerintem ez _ronda_, nagyon, főleg a dupla deklaráció, amely igen gyorsan pofáncsapható egy jó irányzott refactorral:
1 private int _pozitiveNumber;
2 public int PozitiveNumber
3 {
4 get
5 {
6 return _pozitiveNumber;
7 }
8 set
9 {
10 if (value < 0)
11 {
12 throw new Exception();
13 }
14
15 _pozitiveNumber = value;
16 ValueChanged();
17 }
18 }
Ez ugyanaz, 4 sorral kevesebb, nincs redundancia, nincs tévedés, hogy mit és mivel használsz, az IDE pedig legenerál ebből a 14 sorból 8 sort:
1 private int pozitiveNumber;
2 public int getPozitiveNumber()
3 {
4 return this.positiveNumber;
5 }
6 public void setPositiveNumber(int value)
7 {
8 if (value < 0)
9 {
10 throw new Exception();
11 }
12 this.pozitiveNumber = value;
13 ValueChanged();
14 }
Ez a hozzáállás miatt nem képeznek már normális fejlesztőket, csak kódlapátolókat.
Mindig kódlapátolókat képeznek, akikből jobb-rosszabb fejlesztő lesz. De abból még nem lett sikeres program, ha egy junior nekiállt optimalizálni. Abból se lett sikeres program, ha egy optimalizálásban tapasztalatlan senior áll neki optimalizálni.
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Akkor legyen itt Scala-ban is :-) (bár nem vagyok nagy guru benne):
1 private var pozitiveNumber: Int = 0
2
3 def getPozitiveNumber() = pozitiveNumber
4
5 def setPositiveNumber(value: Int) {
6 if (value < 0) throw new Exception()
7 pozitiveNumber = value
8 ValueChanged()
9 }
- A hozzászóláshoz be kell jelentkezni
Ugyanez Java nyelven ismét:
1 private int positiveNumber = 0;
2
3 public int getPositiveNumber() { return this.positiveNumber; }
4
5 public void setPositiveNumber(int value) {
6 if (value < 0) throw new Exception();
7 this.positiveNumber = value;
8 valueChanged();
9 }
Ez is kilenc sor, és most? Csapjuk ki az asztalra, hogy kinek hosszabb vagy vastagabb? :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Félreértesz, nem azért írtam, mert rövidebben meg lehet írni (bár kevesebb karakter van a Scala-sban :-) ), gondolom Te sem a Tiédet a C#-pal szemben, hiszen azt is lehetne tömörebben, hanem azért, hogy a C# és a Java kód mellett itt legyen a Scala-s is.
- A hozzászóláshoz be kell jelentkezni
A fenti kódnál is kb. az elsőt kell leírni, CTRL+R,E -re legenerálja a vázat.
Ellenben látszik egyértelműen, hogy ez egy property, nem egy adattag és nem egy metódus. Látszik az is, hogy a set/get mihez tartozik.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
És ez? (Az [i n d e x] -et nem engedi a drupal, úgyhogy átneveztem ind_x-re)
class Pelda
{
private int[] tomb = new int[10];
public int this[int ind_x]
{
get
{
if (ind_x < 10)
{
return tomb[ind_x];
}
else throw new ...;
}
set
{
if (ind_x < 10)
{
tomb[ind_x] = value;
}
else throw new...;
}
}
}
Utána:
Pelda p = new Pelda();
p[5] = 10;
Console.WriteLine(p[5]);
Szerintem ez például sokkal kényelmesebb mint az akamilyenCollection.get(5).set(10). Főleg ha belegondolsz hogy a nested classoknak megintcsak saját indexereik lehetnek.
[Szerk: most én persze sima array-t használtam, de pont emiatt bármilyen ArrayList, HashTable, stb. viselkedése is hasonló]
- A hozzászóláshoz be kell jelentkezni
Ez elegge csunya kod. Van egy Pelda tipusu objektumom, miert kezelnem tombkent? Az egy objektum. Megvan, hogy mikent kell kezelni, vannak neki metodusai. ha pedig Collection tipusu az adott objektum, akkor a Collectionok legyenek szepen hierarchiaba szervezve. Meg tudod mondani, hogy a [] operator absztrakt metodus, es mindenkeppen Collection-fuggoen kell minden implementalo osztalynak azt megvalositania? Nem ismerem a nyelvet, ezert kerdezem. Onmagaban egy ilyennek sok ertelmet nem latom. Ha kollekciokat akarsz kezelni, arra van framework, es nem veletlenul olyan, amilyen.
- A hozzászóláshoz be kell jelentkezni
Hát nekem sokkal jobban tetszik pl. egy adatbázis lekérést úgy visszakapni, hogy vannak metódusai, propertyjei és ha egy adott mező érdekel akkor sor["mezőnév"] formában érem el. Szubjektív.
Szerk.:
Ettől még pl. a hashtable.Add("akarmi", ertek);
is megmaradt, de később a hashtable["akarmi"] formában lehet elérni.
- A hozzászóláshoz be kell jelentkezni
Ez foleg azert szubjektiv, mert ha mar DB, akkor valamifele ORM megoldas sokkal szebb, mint sorokkal buveszkedni.
- A hozzászóláshoz be kell jelentkezni
Ha elrejtjük, akkor már nincs is. Barbatrükk.
- A hozzászóláshoz be kell jelentkezni
Jaja... igazi programozó Fortranban programozik. :)
Mondanál egy olyan nyelvet, amely nem elrejtett dolgok felett működik? Már a gépi kód is absztrakció... :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Nem mondanék. Nincs azzal baj hogy el van rejtve, nagyon jól van az úgy, de én az indexerekről beszéltem.
Na jó, oké, fölhoztam az adatbázisokat is, de ez most akkor sem tartozik ide :)
- A hozzászóláshoz be kell jelentkezni
Mi a ronda, hol ronda?
- A hozzászóláshoz be kell jelentkezni
saxus felettem levo hozzaszolasahoz annyit fuznek hozza, hogy a legtobb esetben sajnos muszaj tudnod hogy mi van a dobozon belul, ha jo kodot akarsz a vegen. Az emlitett szuper a + a + a peldaban az a ciki, hogy ez az optimalizalas ciklusban mar nem tortenik meg, ergo meg ma is ugyanugy tudnod kell hogyan mukodik.
Ezt a "nem optimalizalunk" dumat ugyanugy nem kell beszopni mint azt sem, hogy a garbage collector feleslegesse teszi a destruktorokat (nem teszi), vagy hogy nem kell foglalkoznod az esetleges memleakekkel (kell).
- A hozzászóláshoz be kell jelentkezni
a destruktor temat mar lefutottuk 1x, nem? ;)
- A hozzászóláshoz be kell jelentkezni
Mielott ujra nekem rohansz: hivhatod ahogy akarod, nem a nev szamit, hanem a funkcionalitas. Miutan ezt tisztaztuk a multkor, akkor ha jol emlekszem egyetertettunk.
Egyebkent se nekem magyarazd, hanem az SWT-s es nehany JDK-s arcnak ;)
- A hozzászóláshoz be kell jelentkezni
Mondjuk ezt úgy, hogy tudni kell, mit tud, mire jó a garbage collector :)
- A hozzászóláshoz be kell jelentkezni
Erre írtam volt:
A kioptimalizálás a JVM dolga, a programozó ne optimalizálgasson feleslegesen, főleg, ha nem is ért hozzá, mert sokszor több kárt csinál, mint hasznot.
Ha az ember optimalizálni akar nyelvi szinten, akkor ehhez kőkeményen tudnia kell, hogy ebből mit csinál a fordító, és mit csinál a JVM, majd mit csinál a JIT. Ha ezekkel nem vagy tisztában, akkor inkább ne is optimalizálj, mert tapasztalataim szerint abból később refaktor lesz.
A felesleges GC futásokat és a memleak gyártó kódokat többnyire a C/C++ irányból érkező programozók ejtik, mivel nem ismerik a GC működését, részben utálják is, és többnyire nem tudják, nem értik, hogy mit és mikor takarít ki, ezért próbálnak maguk takarítani és optimalizálni. Az érdekes egyébként az, hogy ha az ember nem tödődik azzal, hogy optimalizáljon memóriafoglalásra a Java nyelvi szintjén, akkor alig tud olyan helyzetet előállítani, ami memleak jelenséggel jár.
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
U completely missed the point.
Eloszor is, maga a JDK is ad optimalizaciora javaslatot a sajat API leirasukban. Ez pedig azonnal leakeles, mert olyan informaciot arul el, ami az objektum belso dolga kene legyen. De mint tudjuk, a valosag es a szep elmelet kozott van kulonbseg, nyilvan ezen okbol szerepelnek az ilyen "tippek" a leirasokban.
"A felesleges GC futásokat és a memleak gyártó kódokat többnyire a C/C++ irányból érkező programozók ejtik"
Jo lenne ha nem nezned le a C++ programozokat, foleg hogy a JVM nagy resze C++ kod. Miutan ezen tulestunk, folytassuk ott, hogy mi volt a GC igerete (amit ma mar ritkan hangoztatnak), vagy neadjisten fogalmazzuk meg azt az intuitiv igenyt hogy mit szeretnenk hogy elerjunk vele. Ezutan nezzuk meg valojaban mit muvel es rogton latszodik egy hasadek, ami kizarolag a GC mukodesi mechanizmusabol fakad, ergo ujabb leakkel allunk szemben.
"Az érdekes egyébként az, hogy ha az ember nem tödődik azzal, hogy optimalizáljon memóriafoglalásra a Java nyelvi szintjén, akkor alig tud olyan helyzetet előállítani, ami memleak jelenséggel jár."
Fail. Boven eleg, ha a nyelvi szinten mar nem scope-ban levo objektumodra szarik nagy ivben a GC. Ha neked ezzel megis nyelvi szinten kell foglalkoznod (es kell), akkor az nagyon ciki. Eppen a Sun leirasai emlitenek nem egy ilyen esetet, melyek nem csak ugy nagy ritkan neha esetleg megeshetnek, hanem _mindig_ tudnod kell hogy vannak ilyen helyzetek es sosem lehetsz biztos benne hogy az eppen aktualis JVM verzional (neadjisten platformnal) eppen milyen jatekszabalyok vannak.
Pontosan az ilyen mantrak azok, ami miatt eredetileg hozzaszoltam.
- A hozzászóláshoz be kell jelentkezni
A GC absztrakciója leakel a nyelvbe, röviden és tömören. Ez persze természetes, minden (érdemi) absztakció leakel.
- A hozzászóláshoz be kell jelentkezni
Csak annyit jegyeznék meg, hogy nem kevés c++->java programozóval sikerült mostanában összefutnom, és hogy úgy mondjam, nem voltam
elragadtatva :))
Egyébként olyanokra gondolsz, hogy pl. egy listába (queue-ba) pakolok elemeket, aztán elfelejtem kivenni őket?
- A hozzászóláshoz be kell jelentkezni
Nem nézem le a C++ programozókat, de gyakran esnek abba a hibába, hogy tudnak Java nyelven programozni.
Néhány URL-t és példát írhatnál, ha már ennyire belemélyedtél a GC lelkivilágába... :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Majd NagyZ megmondja a tutit ;)
- A hozzászóláshoz be kell jelentkezni
Te hoztad fel a témát.
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Igy van, elso korben kivancsi voltam hogy az allando szajtepo expertek mit reagalnak. Mar tanultam valamit.
- A hozzászóláshoz be kell jelentkezni
en mikor szidtam a GC -t? :) vagy nem ertem, mire gondolsz.
abban mar multkor megegyeztunk, hogy nincs a nyelvben destruktor, a finalize() nem garantalt, hogy akkor fut, amikor Te akarod, es az, hogy talaltal par osztalyt, ahol van dispose(), az nem jelent semmit.
- A hozzászóláshoz be kell jelentkezni
Abbol a szemszogbol nezve amirol irtam, ott szamitanak ezek. A nyelvi szintaktikaban valoban nem, de nem is arrol beszeltem.
- A hozzászóláshoz be kell jelentkezni
Ha minden aron szeretnel a GC-vel interaktalni, az esetben tudom ajanlani a kovetkezo 1.2 ota letezo lehetoseget.
link
Ha tenylegesen destructor szeru takaritast szeretnel, akkor a PhantomReference valtozat lesz a nyero.
- A hozzászóláshoz be kell jelentkezni
_en_ nem szeretnek semmi ilyet. nem ertem hogy az emberek funkcionalis analfabetak, vagy mi. mchalls szeretne ilyet.
- A hozzászóláshoz be kell jelentkezni
Valszeg benezte a szalakat mert masnak is rossz helyre irt. Shit happens :) Egyebkent en sem szeretnek olyat...
- A hozzászóláshoz be kell jelentkezni
Ami viszont garantalt, az az hogy a finalize() rontja a teljesitmenyt, mert nem tudod rogton szemetgyujteni az objektumot (csak bekerul a finalization-re varo objektumok queue-jaba), valamikor kesobb kell egy masodik GC hogy tenyleg felszabaditsa.
- A hozzászóláshoz be kell jelentkezni
Ok, akkor második körben hoznál példákat is magaddal? Vagy csak bejössz, gyorsan szétszórod a bölcsességed és kihátrálsz? :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Pontosan :)
- A hozzászóláshoz be kell jelentkezni
Optimalizáció témához:
És itt jön elő a toolok ereje. Ugyanis ha használunk kódelemzőket, mint pl.: FindBugs, akkor az kapásból felhívja a figyelmet, ha ciklusban fűzöl össze stringet, hogy használj StringBuilder-t.
Memleak: általam összerakott felvételi Java tesztben szerepel, hogy "Lehetséges -e memory leak Javaban?". Sajnos a válaszadók fele nemet szokott írni.
- A hozzászóláshoz be kell jelentkezni
A ciklues eseten azert, mert a StringBuilderes optimalizas miat. Az SB minden ciklus iteracioba lepeldanyosodna, megtortenne az append majd legyartana egy uj String peldanyt. Mig ha a ciklus elott definialod es cikluson belul csak az append fuggveny hivasokat haszanlod akkor mar nem lesz ilyen gond.
- A hozzászóláshoz be kell jelentkezni
Ezt miért írtad nekem?
- A hozzászóláshoz be kell jelentkezni
Magyarazatkent, hogy a findbugs miert hozza ki jogsan hibakanet.
- A hozzászóláshoz be kell jelentkezni
Hát jó. Bár ez szerintem nem volt kérdéses. Ebben a szálban arról volt szó, hogy az optimalizációt mennyire lehet - nem lehet figyelmen kívül hagyni és én csak arra akartam rávilágítani, hogy a nyelvek mellett ma már milyen fontos szerep jut a tooloknak, mint pl.: a statikus kód elemzőknek, amilyen a Findbugs. Az String összefűzés ciklusban csak erre hozott példa volt. Szerintem a magyarázatodnak jobb helye lett volna egy másik szálban.
- A hozzászóláshoz be kell jelentkezni
Szerintem pont ideillik: hiába találja meg a tool faszán a "hibát", ha buta vagy hogy jól javítsd ki. A nyelv nem oldja meg helyetted az optimalizációt általában, viszont ha rosszul próbálkozik akkor sokat kell tanulni, mire megtudod, hogy igazából mit és merre.
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
"A szebb és olvashatóbb dolog szubjektív, nekem valahogy jobban olvashatóbb a
x.setY(z);
mint az
x.y = z;
forma.
Az utóbbi esetén nem lehetek biztos benne, hogy a beállításkor fut-e le a validálás, vagy értesítődik-e a változásról egy observer. Az első esetben az a plusz információ megvan, hogy potenciálisan futni fog validálás, vagy történik valami változáskezelés."
Az első esetben sem lehetsz biztos benne. pl.:
public void setY(Valami param) { y = param; }
Itt sem ellenőriz semmit és nincs értesítés.
Illetve a formától függetlenül a második esetben is futhat validálás és mehet observer értesítés.
Erről jut eszembe a Java-nak egy nagy hülyesége, az osztályok, memberek láthatósága.
Van a public, mindenki láthatja, rendben van. Van a package láthatóság, amikor nem írok semmit, az is rendben van. Van a private, csak az adott osztály láthatja, még a leszármazott sem, rendben van. DE! Van a protected, a leszármazott osztály és a package láthatja. Itt van a kutya elásva!
Ha olyan member változót akarsz csinálni, amit a leszármazottak láthatnak, de más nem, és kívülről csak ellenőrzött módon (metóduson keresztül) állítható, akkor ezt nem tudod elérni, mert az ugyanabban a package-ben levő osztályok közvetlenül is elérhetik a member változót.
Tehát a protected láthatóság használata teljesen kerülendő.
Természetesen ez a rész is "javítva" van a Scala-ban, ráadásul sokkal jobban finomhangolható a láthatóság is.
- A hozzászóláshoz be kell jelentkezni
Eleve úgy mondják, hogy a protected változó tervezési hibára utal (vagy optimalizációra). Nem mintha védeni akarnám a jávát.
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
A member változók esetében nagyjából egyet is értek vele.
Ellenben, vegyünk egy protected metódust, amit nem szeretnél, hogy kívülről hívogassanak, de a leszármazott osztályból szeretnéd elérni. Az én gyakorlatomban ilyenek azért gyakran előfordulnak.
"Nem mintha védeni akarnám a jávát."
Én viszont nem akarom támadni a Javát, azt használom régóta és nagyon is kedvelem, de azt el kell ismerni, hogy van nála jobb és lenne hova fejlődnie.
- A hozzászóláshoz be kell jelentkezni
Akkor mégiscsak támadod :) Konstruktív kritikának hívjuk ezt.
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Az első esetben sem lehetsz biztos benne. pl.:
public void setY(Valami param) { y = param; }
Ezért írtam, hogy "potenciálisan futni fog", egy jelzés a nyelvben, hogy számíthatok akár kivételre is a hívás során.
Tehát a protected láthatóság használata teljesen kerülendő.
Reflection-nel pedig ki tudod olvasni a privát mező értékét is bárhonnan. És? Ettől még a private láthatóság jól jön és lehet rá építeni, csakúgy, mint a protected láthatóságra, amelynek célja az, hogy egy osztályt leszármaztatva hozzá tudj férni mezők értékéhez vagy felül tudj definiálni metódusokat.
A Scala nagyon jó, de mutass Scala alapokon félmillió soros projektet, ha találtál ilyet, akkor mutass közülük olyat, amely nem szenved attól, hogy nincs igazán IDE támogatás, se fejlesztői hozzáértés. :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
"Reflection-nel pedig ki tudod olvasni a privát mező értékét is bárhonnan. És? Ettől még a private láthatóság jól jön és lehet rá építeni, csakúgy, mint a protected láthatóságra, amelynek célja az, hogy egy osztályt leszármaztatva hozzá tudj férni mezők értékéhez vagy felül tudj definiálni metódusokat."
A Reflection a nyelv megkerülése, azt nem látom problémának. A protected-nek az lenne a lényege, amit Te is leírsz, de ugyanabból a package-ből bárki megkerülheti (akár akaratlanul is, ha ide-s tool-okat használ).
"A Scala nagyon jó, de mutass Scala alapokon félmillió soros projektet, ha találtál ilyet, akkor mutass közülük olyat, amely nem szenved attól, hogy nincs igazán IDE támogatás, se fejlesztői hozzáértés. :)"
Egyről beszélünk, had idézzem magam egy kicsit lentebbről:
"Nekem is ilyesmi bajom van vele. Hiába jó a nyelv, ha az egész rendszer nem "production ready". Kellene egy nagyobb szervezet, aki mögé áll."
- A hozzászóláshoz be kell jelentkezni
A Reflection a nyelv megkerülése, azt nem látom problémának. A protected-nek az lenne a lényege, amit Te is leírsz, de ugyanabból a package-ből bárki megkerülheti (akár akaratlanul is, ha ide-s tool-okat használ).
Ugye azonos package-be tenni valamit egy másik valamivel, aztán felháborodott hangnemben kiabálni tervezési hibát legalább annyira szándékos lábonlövés, mint a Reflection használata. :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Nem tudom, hogy nem akarod érteni, vagy tényleg nem érted mit akarok mondani.
Adok inkább egy példát:
Alma osztály:
package gyumolcs;
class Alma {
protected int size = 0;
public setSize(int newSize) {
if (newSize > 10) throw new IllegalArgumentException("Túl nagy alma méret!");
size = newSize;
}
}
Feldolgozó osztály:
package gyumolcs;
class Feldolgozo {
private Alma alma;
public feldolgoz() {
alma.size = 15;
}
}
Az Alma osztály készítője nem szeretné, ha más hozzáférne a size member változóhoz közvetlenül, csak a leszármazott osztály.
Ezzel szemben a feoldolgozo osztály közvetlenül is hozzáfér az alma méretéhez és át tudja állítani kikerülve a set-et.
A feldolgoz metódus írásakor begépeli az "alma."-ot, ilyenkor sok IDE felhozza a választható membereket, ahol akár figyelmetlenségből is kiválaszthatja a méretet (size) és beállíthat rossz értéket.
Én ezt a nyelv hibájának tartom, he Te nem, akkor más a véleményünk ;-)
- A hozzászóláshoz be kell jelentkezni
Én a fejlesztő hibájának tartom, hogy a Feldolgozó osztály a gyumolcs package-ben van.
- A hozzászóláshoz be kell jelentkezni
Ha Körtének hívnák, akkor kinek a hibája?
- A hozzászóláshoz be kell jelentkezni
A fejlesztőé, nyilvánvalóan. (Szerinted mégis milyen modell már az, ahol egy Körte-nek Alma tagváltozója van, illetve egy Körte állítja be egy Alma méretét!? ;)
- A hozzászóláshoz be kell jelentkezni
Az Alma osztály tipikusan "gyumolcsok.interfaces" csomagban van, a Feldolgozo pedig "gyumolcsok.services" csomagban. Továbbra se tudok más mondani: aki azonos csomag alá teszi a két osztályt, amelyeknek egymást elvileg nem szabadna látniuk, akkor az legalább annyira szándékos, mint Reflection-t használni.
Egyébként mutatnál erre a problémára rossz példát tetszőleges nyílt forrású nagyobb Java projekt esetén? :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Látom nem akarod érteni.
Akkor megfordítom a kérdést, hátha így világos lesz.
Mondj egy olyan esetet a protected használatára, amikor szükség van arra, hogy ugyanaz a package más osztálya is elérje a protected member változót közvetlenül!
"Egyébként mutatnál erre a problémára rossz példát tetszőleges nyílt forrású nagyobb Java projekt esetén? :)"
Maga a Java jó lesz? Tömegével lehet belőle meríteni. Pl.:
javax.swing.JWindow: protected JRootPane rootPane;
vagy
javax.swing.JSplitPane: protected int orientation;
javax.swing.JSplitPane: protected boolean continuousLayout;
javax.swing.JSplitPane: protected Component leftComponent;
javax.swing.JSplitPane: protected Component rightComponent;
javax.swing.JSplitPane: protected int dividerSize;
javax.swing.JSplitPane: protected boolean oneTouchExpandable;
javax.swing.JSplitPane: protected int lastDividerLocation;
Bármelyik swing-es osztály a JWindow rootPane member változóját írhatja, kihagyva a JWindow-t, ugyanígy a JSplitPane meber változóit, és lehetne sorolni napestig.
Szerintem, ha megnéznéd a saját projektjeiteket, biztosan ott is van egy pár.
- A hozzászóláshoz be kell jelentkezni
Mondj egy olyan esetet a protected használatára, amikor szükség van arra, hogy ugyanaz a package más osztálya is elérje a protected member változót közvetlenül!
Nem erre való.
Bármelyik swing-es osztály a JWindow rootPane member változóját írhatja, kihagyva a JWindow-t, ugyanígy a JSplitPane meber változóit, és lehetne sorolni napestig. Szerintem, ha megnéznéd a saját projektjeiteket, biztosan ott is van egy pár.
Tele van, mert arra jó, ha leszármaztatod, akkor eléred a leszármaztatott osztályból, nem arra, hogy készakarva átírja a JSplitPane a JWindow protected mezőjét csomagon belül - amelyet azonos cég egymással beszélő fejlesztői fejlesztenek.
Ha neked ez nagyon fáj, akkor valóban nem neked való a Java... :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
"Nem erre való."
Örülök, hogy végre megerősítesz. Tehát nem arra való, amire a Java tervezői kitalálták, hanem arra amire pl. a C++ és a Scala tervezők kitalálták. Tehát csak a leszármazottak érjék el, mások (azonos package-beliek) ne!
Ezzel ezt a szálat a magam részéről le is zárnám.
- A hozzászóláshoz be kell jelentkezni
Sajnos a Java tervezői nem gondoltak arra, hogy akadnak olyan pisztollyal rohangáló programozófélék, akik időnként szándékosan lábonlövik magukat, majd hangosan szídják a pisztolyt, amiért az elsült... :)
Én is lezártam a szálat... :P
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Azért hozzátenném, hogy ha szar a pisztoly akkor persze, ha tudom hogy szar, akkor nem tartom a lábam felé, de ha mindenki azt mondja, hogy milyen jó, akkor lehet kialakul egy hamis biztonságérzet. Te is beláttad, hogy a jáva protected metódusa egy szar pisztoly, nem úgy működik, ahogy minden normális ember és tervező elvárná.
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Akkor most mondjam azt, hogy internal és protected internal? :)
Nem látom be, hogy két, azonos package-ben lévő osztálynak miért kell tudnia matatni egymásban, ha nem muszáj. (Ebből a szempontból az internallal sem vagyok teljesen kibékülve, eddig többnyire tényleg inkább C++ friend class jellegű dolog kellene. Persze, tudom, csináljak rá propertyt/setter/gettert. Van, hogy muszáj sebességre optimalizálni.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
+1
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
A private adat tagok es fugvenyek reflectionel valo hozaferese Applet kontexusban albol nem fog mukodni. Mig a tobbi teruleten egy megfelelo SecurityManagger bealitasaval szinten megoldhato.
- A hozzászóláshoz be kell jelentkezni
Az én véleményem is az, hogy a metódusok nevei egyfajta kötelező dokumentációt jelentenek, ami eleve egy hatalmas plusz az operator overload fölött, ami gyakorlatilag szabad asszociációs játék, hogy ki mit tud beleképzelni mondjuk egy + jelbe.
De a nagyobb baj az, hogy szerintem az operator overloading veszélyes és a programozók döntő többsége rosszul használná, használja. Részben ez azért is van így, mert több oskolában is a rossz használatra tanítják őket. Bár ezen a threaden túlmutat ennek megvitatása, de a Matrix és Vector tipikus op-overloados megvalósításai klasszikus példái ennek a rossz használatnak (tehát nem az op-overload a baj, hanem ahogy implementálják).
- A hozzászóláshoz be kell jelentkezni
Minden Java programozó használ operátorokat (a beépítetteket), azok nem veszélyesek?
"ami gyakorlatilag szabad asszociációs játék, hogy ki mit tud beleképzelni mondjuk egy + jelbe."
Nem kell beleképzelni semmit, kétség esetén el kell olvasni a hozzátartozó javadoc-ot.
Scala-ban az operátorok ugyanolyan metódusok, mint a többi.
Tehát ez: x * y, akár így is írható: x.*(y)
Vagy fordítva x.multiply(y) így is írható: x multiply y
Szerintem ettől a nyelv sokkal jobban használható, mindenhol olyan formát használhatok, amitől olvashatóbb lesz a kód. Persze ezzel nem kell mindenkinek egyetértenie.
- A hozzászóláshoz be kell jelentkezni
A beépített operátorok nem veszélyesek, mert a többségét aritmetikára használjuk (amire való és amit már minden programozó a matek órái óta tanul, másrészt a legtöbb program nyelvben ugyanazt csinálják). Ez alól kivétel a String összefűzésre használt + operátor. Ez egy tipikus operator overloados dolog és lám mennyi probléma van belőle. Ccsak az itteni beszélgetés közben előjött a String összefűzögetés optimalizáció problémája, azaz, hogy nem világos az egységsugarú programozónak, hogy itt a + új String-et hoz létre és nem az első Stringet módosítja. Pedig, ha nem + lenne, hanem metódus jobban látszana mi történik.
Azaz
String s4 = s1 + s2 + s3;
Tisztán OO megvalósítása:
String s4 = s1.clone();
s4.concat(s2);
s4.concat(s3);
lenne (persze jó hosszú mint a rétestészta). Rögtön látszana, hogy mikor jön létre új String. A StringBuilder-rel pont ezt a működést imitáljuk.
A beépített operátoroknak annyi a felmentésük még, hogy előre definiált darabszámú van belőle és be lehet magolni. Ezzel szemben a user definiált operatorok esetén sose tudod mire számíts.
- A hozzászóláshoz be kell jelentkezni
A beepitett operatorok azert nem veszelyesek, mert elore definialt a szemantikajuk. Mindenki szamara ugyanazt jelentik.
- A hozzászóláshoz be kell jelentkezni
A Java nem teljesen OO nyelv. Vannak primitív típusok benne (int, char, boolean stb.)
- A hozzászóláshoz be kell jelentkezni
És ez így van jól!
- A hozzászóláshoz be kell jelentkezni
Így van, ezzel szemben a Scala-ban minden objektum, még a függvények is.
- A hozzászóláshoz be kell jelentkezni
Ha nagyon szigorúan nézzük Javaban is tartozik minden metódushoz egy objektum, ami azt a metódust reprezentálja (és ez az objektum Method osztálypéldány).
Ha arra gondolsz, hogy Scalaban könnyen lehet closure szerűen használni metódusokat, akkor az jön Java7-be is. Bár ez megint csak syntactic sugar, hiszen ezt a működést anonimusz osztályokkal eddig is el lehetett érni.
- A hozzászóláshoz be kell jelentkezni
Arra gondoltam, hogy Scala-ban nincsenek primitívek, minden osztály, csak hozzátettem, hogy még a függvények is azok.
Ebben a szálban én a "syntactic sugar"-t egyfajta szitokszóként érzem, mintha azt akarnátok mondani, hogy amit egyszerűbben, tömörebben, átláthatóbban lehet leírni egy nyelven az rossz.
A gépi kódhoz képest egyébként minden "syntactic sugar".
Vegyük például a Java 5 előtti iterator ciklus, kb. így nézett ki:
for (Iterator iterator = list.iterator(); iterator.hasNext(); Object value = iterator.next())
aztán bejött a syntactic sugar:
for (Object value: list)
Szerintem többek között az ilyen syntactic sugaraktól lesz egy nyelv egyszerűbb, jobb, hatékonyabb, mint egy másik.
- A hozzászóláshoz be kell jelentkezni
Az autoboxing óta a primitíveket nem érzem akkora OO hátránynak.
Ha így nézzük a Scala sem teljesen OO nyelv, mert lehet benne statikus metódusokat használni (még akkor is ha fű alatt ezek singletonként futnak).
- A hozzászóláshoz be kell jelentkezni
Egész pontosan: teljesen OO nyelv, csak néhány dolog úgy néz ki, mintha nem az lenne.
- A hozzászóláshoz be kell jelentkezni
Mindegy, hogy fű alatt OO, ha használatnál nem annak látszik. Az OO szemlélet nem a gépnek kell, hanem a programozónak.
- A hozzászóláshoz be kell jelentkezni
A nem említett pontokban egyetértek, hogy nagy különbség nincs a két rendszer között.
"Ez nem biztos, hogy pozitívum."
Érdemes megismerkedni a funkcionális programozással, még ha az ember imperatív nyelvben dolgozik. Sok olyan előnyös tulajdonsága van, amit ott is ki lehet használni. Az ember nagyon sok mérgelődéstől és hibától kímélheti meg magát funkcionális programozással.
"Mondanál egy példát, ahol te hasznosabbnak tartod az operator overloadingos megoldást egy OOP megoldás helyett?"
A Scala-ban nem igazi operator overloading van, hanem "OOP megoldás", tehát ugyanaz, csak sokkal kifejezőbb.
pl. Készítesz saját szám típust, mondjuk a komplex számokat.
Számomra kifejezőbb az:
x = a * y + b * z ^ 2;
mint az
x = a.multiply(y).add(b.multiply(z.power(2)));
Debuggolni meg ugyanúgy lehet mind a kettőt.
"Hát ez így csak marketing. Vagy mondhatni: Java is."
Példák tömegét lehet hozni, ahol sokkal tömörebben és világosabban ki lehet fejezni magad Scala-ban:
pl. swap:
(x, y) = (y, x)
Collection szétválogatása 18 év alattiakra és felettiekre:
val (minors, adults) = people partition (_.age < 18)
Továbbá címszavakban: currying, clousers, traits (ami sokkal több, mint az interface), a collection kezelése is sokkal jobb (főleg a 2.8 scala-é), ...
"Igazából ez az egyik nagy bajom a Scalaval, hogy tool támogatásban sehol nincs a Javahoz képest"
Nekem is ilyesmi bajom van vele. Hiába jó a nyelv, ha az egész rendszer nem "production ready". Kellene egy nagyobb szervezet, aki mögé áll.
- A hozzászóláshoz be kell jelentkezni
Pontosan a syntactic sugar dologtól félek én is a Scala-val kapcsolatban,
nagyon lábonlövősnek érzem a sok feature-t, főleg egy nagy csapatban. Ha megnézem a java kódot a fenti példában, kapásból látom, hogy milyen member változói vannak, míg a scala kódban végig kell túrnom az összes konstruktort végig a teljes öröklődési láncon. Az operator overloading inkább marginális probléma, nekünk nagyon ritkán kell írni a lenti példában említett számításokat. A C++-os projektünknél pedig az a tapasztalat, hogy állandóan a kódot kell böngésznünk, hogy megnézzük, vajon az adott művelet az adott osztályra felül van-e definiálva, vagy pedig "normálisan" működik.
Az imperativ elemek szépen majd bejönnek a java-ban is, viszont ami nagyon fontos, ésszel, úgy, hogy a meglévő tervezési logikát ne zúzzák szét. (nem pedig a de jó ötlet, bevesszük jelleggel fejlesztik a nyelvet)
- A hozzászóláshoz be kell jelentkezni
"Ha megnézem a java kódot a fenti példában, kapásból látom, hogy milyen member változói vannak, míg a scala kódban végig kell túrnom az összes konstruktort végig a teljes öröklődési láncon."
Ezt nem értem. Öröklésnél Javaban sem látod a member változóit.
KisKresz
- A hozzászóláshoz be kell jelentkezni
"Pontosan a syntactic sugar dologtól félek én is a Scala-val kapcsolatban,
nagyon lábonlövősnek érzem a sok feature-t, főleg egy nagy csapatban."
A rossz programozók bármilyen nyelven képesek rossz kódot írni, esetleg bizonyos nyelvi elemek használata megnehezíti azt (Scala-ban szerintem több ilyen van, mint Java-ban).
Nagy csapatban szükséges (volna) kódolási szabályok, ajánlások meghatározására, egymás ellenőrzésére, Unit tesztek írására, osztályok megtervezésére. Főleg ezek használata véd meg a hibás kódoktól.
(Köz?)Ismert dolog, hogy a kód sorok számával egyenes arányban nő az elkövetett hibák száma a program nyelvektől függetlenül. Ha egy nyelvben tömörebben leírható ugyanaz, akkor kevesebb hibát is fog tartalmazni.
"Ha megnézem a java kódot a fenti példában, kapásból látom, hogy milyen member változói vannak"
A fenti példában ugyanúgy látszik a Scala-ban is, hogy milyen member változói vannak.
(Sőt, általában a kevesebb kódban könnyebb megtalálni valamit, mint a többen)
Egyébként Scala-ban is van lehetőség az összes member változó egyenkénti definiálására is.
- A hozzászóláshoz be kell jelentkezni
Én attól tartok a Scala-val kapcsolatban, hogy mindig van 1-2 okos ember, aki szereti a nagyon furmányos kódokat. Ez persze mindig akkor
derül ki, amikor már otthagyja a céget, és a nyakunkba szakad a kód
maintain-elése. Ha ezeket a lehetőségeket valamennyire lezárjuk (lásd swap-os okosság), máris jobban érezzük magunkat.
Azzal is egyetértek, hogy ha egy nyelvben ugyanaz tömörebben fogalmazható meg, akkor (talán?) kevesebb hibát tartalmaz, bár láttam én már perl kódot, ami nagyon tömör volt, csak éppen olvashatatlan. (write only nyelvek, ugye)
- A hozzászóláshoz be kell jelentkezni
(Köz?)Ismert dolog, hogy a kód sorok számával egyenes arányban nő az elkövetett hibák száma a program nyelvektől függetlenül. Ha egy nyelvben tömörebben leírható ugyanaz, akkor kevesebb hibát is fog tartalmazni.
Hurrá. Írjuk le egy sorba az összes programot, ezzel mindegyik hibátlan lesz! Hatalmas ötlet. :)
Sajnos tömörebb - nehezebben olvasható kódban több a hiba is.
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
"Hurrá. Írjuk le egy sorba az összes programot, ezzel mindegyik hibátlan lesz! Hatalmas ötlet. :)"
Tényleg nagy ötlet, szabadalmaztasd! :-)
Egyébként az továbbra sem fog egy "sornak" számítani.
"Sajnos tömörebb - nehezebben olvasható kódban több a hiba is."
A tömörebb kód pont az olvashatóságot javítja, és kevesebb hibalehetőséget ad. Írtam példának az Iterator-os vs. For-each ciklusos példát, illetve a swap-es példát:
Scala:
(x, y) = (y, x)
Java:
Object temp = x;
x = y;
y = temp;
Melyik az egyszerűbb, átláthatóbb? Melyiket könnyebb elrontani? Melyik közé kerülhet új sor, ami ront az olvashatóságán?
- A hozzászóláshoz be kell jelentkezni
Ilyet sok mas nyelv is tud.
Alapvetoen igaz, hogy tobb kodsorban tobb is a hiba, de java kotelezo alapzajat nem szamolnam kodsornak.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
Nem mondtam, hogy más nyelvek nem tudnak ilyet, mint ahogy az egyik példám éppen a Java-ból volt (For-each).
A kötelező alapzaját én sem számolom annak. Amikre céloztam, illetve a fenti példákban, nincs ilyen.
"Alapvetoen igaz, hogy tobb kodsorban tobb is a hiba"
A fenti kollega éppen ezt igyekszik cáfolni, én csak arra reagáltam. Örülök, hogy egyetértünk! :-)
- A hozzászóláshoz be kell jelentkezni
Eléggé elmaradott ez a Java.
.NET/Mono-t mindenkinek! Az sokkal gyorsabban fejlődik.
- A hozzászóláshoz be kell jelentkezni
Sok sikert a .net-hez. lol.
- A hozzászóláshoz be kell jelentkezni
"Eléggé elmaradott ez a Java.
.NET/Mono-t mindenkinek!"
Miért?
- A hozzászóláshoz be kell jelentkezni
ez olyan 50es évekbeli csasztuska,
újabb csapást mértünk a rodhadó kapitalizmusra! stílus.
csak ez nem rímelt:)
pl lehetett volna
"haladjon ön is a korral,
szopjon dotNET, Mono kóddal"!:)
- A hozzászóláshoz be kell jelentkezni
like :)
- A hozzászóláshoz be kell jelentkezni
A nyelv lehet, hogy fejlődik. De az ecosystem? Hol vannak a jó minőségű, nyílt forrású vagy ingyenes libek .NEThez. Hol egy Apache Software Foundation szintű szoftverház? Vagy a JCP-szintű API leírások, azok kötelező ingyenes referenciaimplementáció, konkurrens implementációk stb. A Java nem a jó nyelv miatt lett a legnépszerűbb platform, hanem a kiterjedt ecosystem miatt.
- A hozzászóláshoz be kell jelentkezni
Ha azt nezed a C sem fejlodik tul sokat megis rengetegen hasznaljak.
Szoval az, hogy van egy stabil platformod ami nem valtozik sokat szamomra inkabb pozitivum mint negativum. Foleg ha komoly vallalati szoftverekrol van szo, ahol egy verziovaltas igen sok penzbe kerulhet. Ha nem is kell programozni semmit, akkor is egy teljes ujratesztelest igenyel ami sok ido es penz. Szoval remelem az A terv valosul meg, mivel leverni a managementen evente egyszer a verziovaltast igen nagy szopas lesz.
- A hozzászóláshoz be kell jelentkezni
Getter-setter nélkül élés:
http://java.dzone.com/articles/java-properties-without
Itt volt a property leirás, mely a jelek szerint nem lesz a java7-ben:
- A hozzászóláshoz be kell jelentkezni
itt egy gyakorlatias megoldás boilerplate kód elkerülésére : http://projectlombok.org/ (ha valakinek sikerül GWT-vel összelőni, kérem szóljon :) )
- A hozzászóláshoz be kell jelentkezni
+1
Ez jónak tűnik elsőre. Köszi!
- A hozzászóláshoz be kell jelentkezni
Koszi, pont a lombok-ot akartam linkelni (a multkor mutattak irc-en), csak nem jutott eszembe a neve :)
- A hozzászóláshoz be kell jelentkezni
Nálam marha lassan indulnak a java appletek, és mostmár odáig fajult a dolog, hogy minden egyes java applet lefagyasztja a Firefoxot. Le is tiltottam a plugint.
- A hozzászóláshoz be kell jelentkezni
uh, gratulalunk! megragadtad a cikk velejet, es ilyen melyrehato elemzessel se talalkoztam meg.
- A hozzászóláshoz be kell jelentkezni