Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Modifikátor protected v Javě

Aktivity
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:30.12.2012 17:51

Ahoj všichni,
měl jsem takovou aplikaci v Javě. Předek měl proměnnou s modifikátorem protected. Na instanci potomka však byla tato proměnná přístupná zvenčí. Myslel jsem, že by neměla být. Může mi to někdo vysvětlit?

Odpovědět
30.12.2012 17:51
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:30.12.2012 18:01

http://docs.oracle.com/…control.html
Je to tam pěkně znázorněné na obrázku a v tabulkách. :-)

 
Nahoru Odpovědět
30.12.2012 18:01
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:30.12.2012 18:05

U protected je u World NO. Proto to nechápu o_O

Nahoru Odpovědět
30.12.2012 18:05
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:30.12.2012 18:07

No já world zde chápu jako kdyby ta proměnná byla v externí knihovně, kterou chci použít.

 
Nahoru Odpovědět
30.12.2012 18:07
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:30.12.2012 18:08

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.

Nahoru Odpovědět
30.12.2012 18:08
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:30.12.2012 18:16

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.

 
Nahoru Odpovědět
30.12.2012 18:16
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:30.12.2012 18:18

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

Nahoru Odpovědět
30.12.2012 18:18
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:30.12.2012 18:20

Ano, pro protected platí -> stejný balíček nebo být potomkem

 
Nahoru Odpovědět
30.12.2012 18:20
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:30.12.2012 18:21

Aha... Zkusím to v C#, měl jsem za to, že to tam funguje jinak. Napíšu.

Nahoru Odpovědět
30.12.2012 18:21
You are the greatest project you will ever work on.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:30.12.2012 18:23
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.

Nahoru Odpovědět
30.12.2012 18:23
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:30.12.2012 18:26

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

 
Nahoru Odpovědět
30.12.2012 18:26
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:30.12.2012 18:33

Takže private proměnné se v Javě normálně dědí a jsou viditelné v potomcích?

Nahoru Odpovědět
30.12.2012 18:33
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:30.12.2012 18:35

Nejsou viditelné a z toho důvodu se taky dělá hromada getterů a setterů.

 
Nahoru Odpovědět
30.12.2012 18:35
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Fugiczek
Kit:30.12.2012 18:41

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

Nahoru Odpovědět
30.12.2012 18:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Fugiczek
Kit:30.12.2012 18:53

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.

Nahoru Odpovědět
30.12.2012 18:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:30.12.2012 19:09

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.

Nahoru Odpovědět
30.12.2012 19:09
You are the greatest project you will ever work on.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:30.12.2012 19:11

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.

Nahoru Odpovědět
30.12.2012 19:11
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:30.12.2012 19:20

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.

 
Nahoru Odpovědět
30.12.2012 19:20
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:30.12.2012 19:24

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

Nahoru Odpovědět
30.12.2012 19:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:30.12.2012 19:26

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.

Nahoru Odpovědět
30.12.2012 19:26
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:30.12.2012 19:30
private int x;
public int getX(){return x;}

Vidím 2 řádky. Záleží na úpravě kódu. :-)

 
Nahoru Odpovědět
30.12.2012 19:30
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:30.12.2012 19:34

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.

Editováno 30.12.2012 19:34
Nahoru Odpovědět
30.12.2012 19:34
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:30.12.2012 19:40

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

 
Nahoru Odpovědět
30.12.2012 19:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Tato diskuze byla označena moderátorem jako nekonstruktivní a myslíme si, že nemá pro veřejnost příliš vysokou hodnotu. Členy můžete samozřejmě stále oslovit soukromě a to formou zpráv nebo chatu.

Zobrazeno 23 zpráv z 23.