Može li konstruktor u Javi biti privatan?

Može li se konstruktor zatvoriti? Koliko je koristan privatni konstruktor?

172
12 мая '10 в 7:26 2010-05-12 07:26 Rajesh je pitao 12. svibnja 2010. u 7:26 2010-05-12 07:26
@ 15 odgovora

Da, konstruktor može biti zatvoren. To su različite namjene. Jedna od njih koristi anti-šablon dizajna singleton , koji bih vam savjetovati da koristite. Još jedna legitimnija upotreba je delegiranje konstruktora; Možete imati jednog konstruktora koji prihvaća mnogo različitih opcija koje su stvarno detalji implementacije, tako da ih učinite privatnim, ali onda će vam drugi konstruktori delegirati.

Kao primjer delegiranja konstruktora, sljedeća klasa vam omogućuje da spremite vrijednost i tip, ali to vam dopušta samo da to učinite za podskup tipova, tako da trebate učiniti zajednički konstruktor privatnim kako bi se osiguralo da su dopušteni samo dopušteni tipovi. Generički privatni konstruktor pomaže kod ponovnog korištenja.

 public class MyClass { private final String value; private final String type; public MyClass(int x){ this(Integer.toString(x), "int"); } public MyClass(boolean x){ this(Boolean.toString(x), "boolean"); } public String toString(){ return value; } public String getType(){ return type; } private MyClass(String value, String type){ this.value = value; this.type = type; } } 

ispraviti
Gledajući ovaj odgovor nekoliko godina kasnije, želio bih istaknuti da je ovaj odgovor nepotpun, ali i pomalo ekstreman. Singlovi su doista anti-oblikovani i trebali bi se općenito izbjegavati kad god je to moguće; Međutim, postoje mnoge primjene privatnih konstruktora, osim pojedinačnih, a moj odgovor zove samo jedan.

Osigurati još nekoliko slučajeva kada se koriste privatni konstruktori:

  • Stvoriti ne-intuitivnu klasu koja je jednostavno skup povezanih statičkih funkcija (ovo je u osnovi singlet, ali ako nema stanja i statičke funkcije rade isključivo na parametrima, a ne na stanju klase, to nije tako nerazumno pristup prijašnje jastvo, iako koristi sučelje koje je uvedeno ovisnostima, često pojednostavljuje API podršku kada je potrebno više ovisnosti ili drugih oblika konteksta za implementaciju.

  • Kada postoji nekoliko različitih načina za stvaranje objekta, privatni konstruktor može olakšati razumijevanje različitih načina za stvaranje objekta (na primjer, čitljiviji za vas new ArrayList(5) ili ArrayList.createWithCapacity(5) , ArrayList.createWithContents(5) , ArrayList.createWithInitialSize(5) ). Drugim riječima, privatni konstruktor vam omogućuje da pružite tvorničku funkciju, čija su imena razumljivija, a zatim stvaranje privatnog konstruktora osigurava da ljudi koriste samo očiglednija imena. To se također obično koristi s predložkom graditelja . Na primjer:

     MyClass myVar = MyClass .newBuilder() .setOption1(option1) .setOption2(option2) .build(); 
124
12 мая '10 в 7:29 2010-05-12 07:29 je odgovorio Michaelu Aaronu Safyanu 12. svibnja '10. u 7:29 2010-05-12 07:29

Očekivao sam da će netko ovo spomenuti (druga točka), ali ... postoje tri načina korištenja privatnih konstruktora:

border=0
  • spriječiti stvaranje instance izvan objekta, u sljedećim slučajevima:

    • jednu točku
    • tvornička metoda
    • klasa statičke metode (uslužni program)
    • stalna klasa
      ,
  • za sprječavanje podsekcije (proširenje). Ako stvorite samo privatni konstruktor, nijedna klasa ne može proširiti vašu klasu, jer ne može pozvati super() konstruktor. To je svojevrsni sinonim za final

  • preopterećeni konstruktori - kao rezultat metoda preopterećenja i konstruktora, neki mogu biti privatni, a neki javni. Pogotovo ako u konstruktorima imate ne-javnu klasu, možete stvoriti javni konstruktor koji stvara instancu te klase i zatim je prosljeđuje privatnom konstruktoru.

75
12 мая '10 в 8:04 2010-05-12 08:04 odgovor je dao Božo 12. svibnja '10. u 8:04 2010-05-12 08:04

Da, može. Privatni konstruktor će postojati kako bi spriječio stvaranje instance klase, ili zato što se konstrukcija događa samo interno, na primjer. tvornicu. Više informacija potražite ovdje .

18
12 мая '10 в 7:29 2010-05-12 07:29 Odgovor je dao Feanor 12. svibnja '10. U 7:29 2010-05-12 07:29

Da.

To znači da možete upravljati načinom izrade instance klase. Ako napravite konstruktora zatvorenim, a zatim stvorite vidljivu metodu konstruktora koja vraća instance klase, možete raditi stvari kao što je ograničenje broja bića (obično je samo jedan slučaj zajamčen) ili recikliranje instanci ili drugih zadataka povezanih s konstrukcijom.

Pokretanje new x() nikad ne vraća null , ali koristeći tvornički uzorak možete vratiti null ili čak vratiti različite podtipove.

Možete ga koristiti i za klasu koja nema instance ili svojstva instance, samo statične - kao u klasi servisnih funkcija.

15
12 мая '10 в 7:28 2010-05-12 07:28 odgovor je dao lavinio 12. svibnja '10. u 7:28 2010-05-12 07:28

Pa, ako su sve vaše metode u klasi statične, onda je privatni konstruktor dobra ideja.

8
28 июня '12 в 14:31 2012-06-28 14:31 odgovor je dao lichenbo 28. lipnja 2012. u 2:31 pm 2012-06-28 14:31

Privatni konstruktori mogu se definirati u Javi iz sljedećih razloga.

  • Da biste imali kontrolu nad stvaranjem Java objekata, neće vam dopustiti stvaranje instance objekta.

  • On ne dopušta klasu klase

  • To je osobito korisno kod implementacije singleton obrasca , on koristi privatne konstruktore i ima instancu za kontrolu cijele aplikacije.

  • ako želite klasu sa svim definiranim konstantama i više ne trebate njezinu instancu, proglašavamo ovu klasu privatnim konstruktorom.

6
12 мая '10 в 8:32 2010-05-12 08:32 odgovor je dao gmhk 12. svibnja '10. u 8:32 2010-05-12 08:32

Neki od razloga zašto vam je potreban privatni konstruktor: Pristup konstruktoru moguć je samo iz statičke tvorničke metode unutar samog razreda. Singleton također može pripadati ovoj kategoriji. Klasa > koja sadrži samo statičke metode.

6
12 мая '10 в 8:55 2010-05-12 08:55 odgovor je dao giri 12. svibnja '10 u 8:55 2010-05-12 08:55

Da.

Privatni konstruktor se koristi za sprječavanje inicijalizacije instance, kao što je konačna Math klasa koju koristite u javi. Singleton također koristi privatnog konstruktora.

5
12 мая '10 в 9:21 2010-05-12 09:21 odgovor je dat ryf9059 12. svibnja '10 u 9:21 2010-05-12 09:21

Da, klasa može imati privatnog konstruktora. To je potrebno kako bi se onemogućio pristup konstruktoru iz drugih klasa i ostao dostupan unutar određene klase.

Zašto želite stvoriti objekte svoje klase samo unutar? To se može učiniti iz bilo kojeg razloga, ali jedan od mogućih razloga je da želite implementirati singl. Singleton je uzorak dizajna koji vam omogućuje da stvorite samo jednu instancu svoje klase, a to se može učiniti pomoću privatnog konstruktora.

3
07 июня '12 в 13:33 2012-06-07 13:33 odgovor je dao SBTec 07. lipnja 2012. u 13:33 2012-06-07 13:33

Da. Klasa može imati privatni konstruktor. Čak i apstraktna klasa može imati privatnog konstruktora.

Čineći konstruktora zatvorenim, sprečavamo stvaranje instance klase, kao i potklasu ove klase.

Evo nekih upotreba privatnog konstruktora:

2
09 июля '17 в 15:04 2017-07-09 15:04 odgovor je dao Abhi Andhariya 9. srpnja 2006. u 15:04 2017-07-09 15:04

Da, i koristi se za sprječavanje stvaranja instance i zatim je poništava. Najčešće se koristi u pojedinačnim razredima.

2
12 мая '10 в 8:00 2010-05-12 08:00 Odgovor je dao Vaishak Suresh 12. svibnja 2010. u 8:00. 2010-05-12 08:00

Da, konstruktor može biti zatvoren. Privatni konstruktor ne dopušta bilo kojoj drugoj klasi da stvori primjer primjera privatnog konstruktora.

 public class CustomHttpClient { private static HttpClient customHttpClient;  private CustomHttpClient() { }} 
2
05 окт. odgovor je dat jai_b 05. 2013-10-05 13:22 '13 u 13:22 2013-10-05 13:22

Privatni konstruktori ne zabranjuju eksplicitno instanciranje klasa, pogledajte dodatne informacije o privatnom konstruktoru.

1
12 мая '10 в 7:29 2010-05-12 07:29 odgovor je dao GustyWind 12. svibnja 2010. u 7:29 2010-05-12 07:29

Glavna ideja stvaranja privatnog konstruktora je ograničavanje stvaranja instance klase izvan JVM-a, ali ako klasa ima konstrukt argumenta, to znači da namjerno stvara instancu.

0
12 мая '10 в 11:43 2010-05-12 11:43 Odgovor je dao Phani 12. svibnja 2010. u 11:43 sati 2010-05-12 11:43

Za mene, možemo proglasiti konstruktora privatnim, a također možemo dobiti instancu te klase u potklasi koristeći statičku metodu u klasi u kojoj proglašavamo konstruktora, a zatim vratiti predmet klase. ovu metodu klasificiramo iz podrazreda pomoću naziva classname.method bcz, ovo je statička metoda i dobivamo instancu klase u kojoj proglašavamo const.

0
07 марта '14 в 11:49 2014-03-07 11:49 odgovor je dao korisnik3391823 07. ožujka 2014. u 11:49 2014-03-07 11:49

Ostala pitanja o oznakama ili postavljanju pitanja