Programavimas

Vidinės klasės

Klausimas: Taigi, kam vis dėlto naudingos vidinės klasės?

A: Vidinės klasės peri per kitas klases. Normali klasė yra tiesioginis paketo narys, aukščiausio lygio klasė. Vidinės klasės, kurios tapo prieinamos su „Java 1.1“, yra keturių skonių:

  • Statinės narių klasės
  • Narių klasės
  • Vietinės klasės
  • Anoniminės klasės

Greitai apžvelkime kiekvieną iš eilės.

Trumpai tariant, a statinio nario klasė yra statiškas klasės narys. Kaip ir bet kuris kitas statinis metodas, statinio nario klasė turi prieigą prie visų tėvų arba aukščiausio lygio statinių metodų.

Kaip ir statinio nario klasė, a narių klasė taip pat apibrėžiamas kaip klasės narys. Skirtingai nuo statinės veislės, narių klasė yra specifinė, ji turi prieigą prie visų metodų ir narių, net ir tėvų tai nuoroda.

Vietinis klasės yra deklaruojamos kodo bloke ir yra matomos tik tame bloke, kaip ir bet kuris kitas metodo kintamasis.

Galiausiai Anoniminis klasė yra vietinė klasė, neturinti pavadinimo.

Norėdami atsakyti į konkretų jūsų klausimą, daugiausia dėmesio skirsiu nariams ir anoniminėms vidinėms klasėms, nes tikėtina, kad su jais susidursite ir naudosite. Man vidinių klasių pranašumus galima suskirstyti į tris kategorijas: objektyvų, organizacinį ir atgalinio pranašumą.

Objektyvus pranašumas

Mano kuklia nuomone, svarbiausia vidinės klasės ypatybė yra ta, kad ji leidžia daiktus paversti daiktais, kurių paprastai nepaverstum daiktais. Tai leidžia jūsų kodą labiau orientuoti į objektą, nei jis būtų be vidinių klasių.

Pažvelkime į narių klasę. Kadangi jo egzempliorius yra pirminės instancijos narys, jis turi prieigą prie kiekvieno iš tėvų narių ir metodų. Iš pirmo žvilgsnio tai gali atrodyti nedaug; mes jau turime tokią prieigą iš metodo tėvų klasėje. Tačiau narių klasė leidžia mums išimti iš tėvų logiką ir ją objektyvizuoti. Pavyzdžiui, medžių klasėje gali būti metodas ir daugybė pagalbinių metodų, kurie atlieka medžio paiešką ar vaikščiojimą. Žiūrint į objektą, medis yra medis, o ne paieškos algoritmas. Tačiau norint atlikti paiešką jums reikia išsamių žinių apie medžio duomenų struktūras.

Vidinė klasė leidžia mums pašalinti tą logiką ir įtraukti ją į savo klasę. Taigi, žiūrint į objektą, funkciją ištraukėme iš ten, kur ji nepriklauso, ir įtraukėme į savo klasę. Naudodamiesi vidine klase, mes sėkmingai atsiejome paieškos algoritmą nuo medžio. Dabar, norėdami pakeisti paieškos algoritmą, galime tiesiog pakeisti naują klasę. Galėčiau tęsti, bet tai atveria mūsų kodą daugeliui privalumų, kuriuos suteikia į objektą orientuotos technikos.

Organizacinis pranašumas

Objektyvus dizainas nėra kiekvieno dalykas, tačiau, laimei, vidinės klasės suteikia daugiau. Organizaciniu požiūriu vidinės klasės leidžia mums toliau organizuoti savo paketų struktūrą naudojant vardų sritis. Užuot viską sumetę į plokščią pakuotę, klasės gali būti toliau įdėtos į klases. Aiškiai, be vidinių klasių, mes apsiribojome tokia hierarchijos struktūra:

1 paketas 1 klasė 2 klasė ... n klasė ... paketas n 

Vidinėse klasėse galime atlikti šiuos veiksmus:

paketas 1 klasė 1 klasė 2 klasė 1 klasė 2 ... klasė n 

Atsargiai naudojamos vidinės klasės gali suteikti struktūrinę hierarchiją, kuri natūraliau tinka jūsų klasėms.

Atgalinio skambučio pranašumas

Vidinių narių klasės ir anoniminės klasės yra patogus būdas nustatyti atgalinius skambučius. Akivaizdžiausias pavyzdys yra susijęs su GUI kodu. Tačiau atgalinio skambučio taikymas gali apimti daugelį domenų.

Daugelis „Java“ GUI turi tam tikrą komponentą, kuris skatina actionPerformed () metodo skambutis. Deja, dauguma kūrėjų paprasčiausiai turi savo pagrindinį langą „ActionListener“. Dėl to visi komponentai yra vienodi actionPerformed () metodas. Norint išsiaiškinti, kuris komponentas atliko veiksmą, paprastai yra didžiulis, negražus jungiklis actionPerformed () metodas.

Štai monolitinio įgyvendinimo pavyzdys:

public class SomeGUI praplečia JFrame įgyvendina ActionListener {apsaugotas JButton mygtukas1; apsaugotas JButton mygtukas2; ... apsaugotas J mygtuko mygtukasN; public void actionPerformed (ActionEvent e) {if (e.getSource () == mygtukas1) {// daryk ką nors kita, jei (e.getSource () == mygtukas2) {... jūs gaunate nuotrauką 

Kai matote jungiklius arba didelius jei/jei dar blokai, galvoje turėtų pradėti skambėti garsūs pavojaus varpai. Apskritai, tokios konstrukcijos yra netinkamas objektinis dizainas, nes pakeitus vieną kodo sekciją gali reikėti atitinkamai pakeisti jungiklio sakinį. Vidinių narių klasės ir anoniminės klasės leidžia mums pabėgti nuo perjungtųjų actionPerformed () metodas.

Vietoj to galime apibrėžti vidinę klasę, kuri įgyvendinama „ActionListener“ kiekvienam komponentui, kurio norime klausytis. Tai gali sukelti daugybę vidinių klasių. Tačiau galime išvengti didelių jungiklių teiginių ir turėti papildomą pranašumą už savo veiksmų logikos apibendrinimą. Be to, toks požiūris gali pagerinti našumą. Jungiklyje, kur yra n palyginimų, galime tikėtis n / 2 palyginimai vidutiniu atveju. Vidinės klasės leidžia užmegzti 1: 1 korespondenciją tarp veiksmo atlikėjo ir veiksmo klausytojo. Didelėje GUI toki optimizavimas gali padaryti didelę įtaką našumui. Anonimas gali atrodyti taip:

viešoji klasė SomeGUI pratęsia JFrame {... mygtuko narių deklaracijas ... apsaugotas void buildGUI () {button1 = new JButton (); mygtukas2 = naujas J mygtukas (); ... button1.addActionListener (new java.awt.event.ActionListener () {public void actionPerformed (java.awt.event.ActionEvent e) {// do something}}); .. pakartokite kiekvieną mygtuką 

Naudojant vidinių narių klases, ta pati programa atrodytų taip:

public class SomeGUI praplečia JFrame {... mygtuko narių deklaracijas // vidinės klasės apibrėžimai klasė Button1Handler įgyvendina ActionListener {public void actionPerformed (ActionEvent e) {// do something}} ... ... kiekvienam mygtukui apsaugotam void buildGUI () {// inicializuoti mygtukų mygtuką1 = naujas JButton (); mygtukas2 = naujas J mygtukas (); ... // užregistruokite vidinio klasės veiksmų klausytojo egzempliorių // kiekvienam mygtuko mygtukui1.addActionListener (naujas Button1Handler ()); .. pakartokite kiekvieną mygtuką 

Kadangi vidinės klasės turi prieigą prie visų tėvų dalykų, galime perkelti bet kokią logiką, kuri būtų pasirodžiusi monolite actionPerformed () įgyvendinimas vidinei klasei.

Aš norėčiau naudoti narių klases kaip skambučius. Tačiau tai yra asmeninių pageidavimų klausimas. Tiesiog jaučiu, kad per daug anoniminių klasių sugadina kodą. Taip pat jaučiu, kad anoniminės klasės gali tapti nepatogios, jei jos yra didesnės nei viena ar dvi eilutės.

Trūkumai?

Kaip ir bet ką kitą, jūs turite pasiimti gera su bloga. Vidinės klasės turi savo trūkumų. Priežiūros požiūriu, nepatyrusiems „Java“ kūrėjams gali būti sunku suprasti vidinę klasę. Naudojant vidines klases, jūsų kode taip pat padidės bendras klasių skaičius. Be to, žvelgiant iš kūrimo pusės, dauguma „Java“ įrankių šiek tiek pritaria vidinių klasių palaikymui. Pvz., Kasdieniniam kodavimui naudoju „IBM VisualAge for Java“. Nors vidinės klasės bus sudarytos „VisualAge“, vidinės klasės naršyklės ar šablono nėra. Vietoj to, jūs tiesiog turite įvesti vidinę klasę tiesiai į klasės apibrėžimą. Deja, tai apsunkina naršymą vidinėje klasėje. Taip pat sunku įvesti, nes prarasite daugelį „VisualAge“ kodo užbaigimo priemonių, kai įvedate klasės apibrėžimą arba naudojate vidinę klasę.

Tony Sintesas yra „ObjectWave“ vyresnysis konsultantas, specializuojantis telekomunikacijų srityje. „Sintes“, „Sun“ sertifikuotas „Java 1.1“ programuotojas ir „Java 2“ kūrėjas, dirba su „Java“ nuo 1997 m.

Sužinokite daugiau apie šią temą

  • „Sun“ pateiktoje „Vidinių klasių specifikacijoje“ išsamiai apžvelgiamos vidinės klasės

    //java.sun.com/products/jdk/1.1/docs/guide/innerclasses/spec/innerclasses.doc.html

Šią istoriją „Vidinės klasės“ iš pradžių išleido „JavaWorld“.

$config[zx-auto] not found$config[zx-overlay] not found