Diskuze: Modifikátor protected v Javě
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Vlastník

Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
http://docs.oracle.com/…control.html
Je to tam pěkně znázorněné na obrázku a v tabulkách.
No já world zde chápu jako kdyby ta proměnná byla v externí knihovně, kterou chci použít.
Ano a já jí tam takto zvenku viděl přesto, že byla protected. Byl jsem v metodě main a napsal jsem instance.promenna a bylo to OK. Když jsem jí dal private, tak zmizela.
A nemáš ten main ve stejným balíčku jako třídu s proměnnýma typu
protected?
Jinak tady to máš názorně:
http://www.stevideter.com/…nce-in-java/
Zkoušel jsem to a podle toho mi to funguje.
Mám je ve stejném balíčku. Protected tedy funguje mezi balíčky? Měl jsem za to, že je mezi třídami. Musím to zkusit v C#.
Ano, pro protected platí -> stejný balíček nebo být potomkem
Aha... Zkusím to v C#, měl jsem za to, že to tam funguje jinak. Napíšu.
namespace ProtectedTest
{
class A
{
protected int a;
}
class B : A
{
}
class Program
{
static void Main(string[] args)
{
B b = new B();
b.a = 5; // compile error
}
}
}
Funguje to opravdu jinak. Nevěděl jsem, že jsou mezi C# a Javou až takovéhle rozdíly.
Proto se v Javě, pokud nemáš nějaký pádný důvod opaku, dává všem
proměnným práva private, nebo aspoň se to doporučuje.
Takže private proměnné se v Javě normálně dědí a jsou viditelné v potomcích?
Nejsou viditelné a z toho důvodu se taky dělá hromada getterů a setterů.
Jak jsem zjistil, tak ty gettery a settery se interně převádí na přímý přístup k proměnným (provádí se inline), takže negativní dopad na výkon to nemá.
Na druhou stranu to není špatné, pokud si rodiče nenechají koukat do
kuchyně a potomek si musí o všechno říct
To množství getterů a setterů se dá dost omezit, pokud se rodič naučí se svými daty manipulovat. Potomek si přece nebude vyptávat jednotlivé suroviny a vařit z nich jídlo, když může říct, že má hlad a dostane od rodiče hotový pokrm.
Mno, přijde mi to minimálně divné, ale stejně tak mi přijde divné, že Java ve verzi 7 nebo kolik stále nemá nic automatického na gettery a settery. Prostě se s tím smířím, tolik v ní zas nedělám.
Ale když si udělám getter, tak ten má přeci také modifikátor. Já chci proměnnou v předkovi, která zvenku není vidět a přitom s ní potomek může manipulovat. Když udělám public getter, bude vidět zas zvenčí a to já nechci. Když ho udělám privátní, nebude vidět ani ten getter, stejně jako ta proměnná, ne? A protected zas funguje jen mezi balíčky. To jedině dávat třídy do jiných balíčků. To je dost hloupé tedy, nedivím se, že to MS změnil.
Však do balíčků se člení úplně normálně. Jinak protected
má rozšířené práva kvůli lepší manipulaci, nejspíš to chtěla velká
část komunity. Na co automatické gettery/settery? Buď si ho udělám nebo
ne, udělám přístup nebo ne.
Zřejmě je to motivace k tomu, aby se automatické gettery a settery nedělaly. V podstatě jen suplují public přístup k interním proměnným objektu a to je špatně.
Protected je vlastně jakýsi kočkopes. Proč by si měl nechat rodič sahat na proměnné a metody, které si chce chránit? Buď přístup povolí, anebo ne.
Kdybys začínal s Javou, asi by ti připadlo nelogické, jak to dělá C#.
Jde o přehlednost kódu. Proměnná s getterem a setterem zabere ve třídě 7 řádků, v C# máš to samé na 1. Když máš ve třídě 20 takových proměnných, tak už je to rozdíl. Je to opakující se a stále stejná úloha, kde není důvod, aby to za nás jazyk neudělal.
private int x;
public int getX(){return x;}
Vidím 2 řádky. Záleží na úpravě kódu.
Co jsem viděl, tak IDE to generují standardně takto:
public int getX()
{
return x;
}
public int setX(int x)
{
this.x = x;
}
To je dokonce 9 řádků koukám. V C# uděláš to samé takhle:
public int X { get; set; }
Teď si to představ x20.
EDIT: U Javy ještě plus řádek s proměnnou, takže 10, s mezerou 11.
Nikdy jsem nepotřeboval mít tolik getterů a setterů v jedné třídě,
používám kombinaci protected a private s get/set. Myslím, že je správný
čas tuhle debatu uzavřít, tohle by vedlo k dlouhé nesmyslné diskuzi. Java
to má tak a C# to má prostě jinak. Jsou to rozdílné jazyky a každý si
může používat jaký chce. Přístupové právo protected,
ke kterému bylo tohle téma, jsme už vyřešili.
Zobrazeno 23 zpráv z 23.