Mikor lesz Java 7?

Címkék

A jelenleg az Oracle alkalmazásában álló Mark Reinhold, aki a Java platform fejlesztését vezeti blogbejegyzésében azt firtatta, hogy mikor is lesz elérhető a Java 7 végleges kiadása.

Reinhold szerint a jelenlegi ütemterv tarthatatlan, amit azzal magyaráz, hogy az 9 hónappal ezelőtt - még a Sun Oracle általi felvásárlása előtt - készült, és az integrációs folyamat a vártnál tovább tartott. Ugyanakkor hozzáteszi, hogy készen állnak arra, hogy a fejlesztésre összpontosítsanak egy nagyobb (és egyre növekvő) csapattal.

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.

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 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

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 Lambda es a Jigsaw meg ertheto, de a Coin szetdrabolasa mar kevesbe. Szvsz a Lambda csusztatasa meg oke, de Jigsaw must have.

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

É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.

+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.

+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.


• 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.

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.

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.

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.

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.

"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

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

"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

"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.

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

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

É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ó]

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.

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.

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).

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

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.

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 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.

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.

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 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 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.

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

"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 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

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 ;-)

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

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.

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

"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.

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

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

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

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).

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 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.

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.

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 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.

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)

"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

"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.

É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)

(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

"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?

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! :-)

Eléggé elmaradott ez a Java.
.NET/Mono-t mindenkinek! Az sokkal gyorsabban fejlődik.

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.

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.

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.