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.
Zobrazeno 23 zpráv z 23.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.
