Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 78

Автор Π‘Ρ€ΡŽΡ ЭккСль

РСгистрация Ρ„Π°Π±Ρ€ΠΈΠΊ

Π£ построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ Pet Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ нСдостаток: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ Pet, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² LiteralPet-Creator.java. Π’ систСмах с рСгулярным Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²Ρ‹Ρ… классов это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ, β€” Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс статичСский ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавлял Π±Ρ‹ свой класс Π² Π½Π΅ΠΊΠΈΠΉ список. К соТалСнию, статичСскиС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ класса, поэтому Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Β«ΠΏΠΎΡ€ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΡ€ΡƒΠ³Β»: класс отсутствуСт Π² спискС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, поэтому Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ этого класса, соотвСтствСнно, класс Π½Π΅ загрузится ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² список.

По сути, Π²Ρ‹ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ список Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ (Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список). ВСроятно, Π»ΡƒΡ‡ΡˆΠ΅Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, β€” это Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ список Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΌ мСстС. ВСроятно, Π»ΡƒΡ‡ΡˆΠΈΠΌ мСстом для Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ.

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ внСсСм Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅: созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ самому классу с использованиСм ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Β«ΠΌΠ΅Ρ‚ΠΎΠ΄-Ρ„Π°Π±Ρ€ΠΈΠΊΠ°Β». ΠœΠ΅Ρ‚ΠΎΠ΄-Ρ„Π°Π±Ρ€ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½ΠΎ ΠΈ создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΉ вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ-Ρ„Π°Π±Ρ€ΠΈΠΊΠΎΠΉ являСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ create() интСрфСйса Factory:

//: typeinfo/factory/Factory.java package typeinfo.factory:

public interface Factory<T> { T createO; } ///β€’-

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ T позволяСт create() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Factory. Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Part содСрТит список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-Ρ„Π°Π±Ρ€ΠΈΠΊ. Π€Π°Π±Ρ€ΠΈΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ createRandom(), Β«Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡΒ» Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π² список partFactories:

//: typeinfo/RegisteredFactories.java II РСгистрация Ρ„Π°Π±Ρ€ΠΈΠΊ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС import typeinfo.factory.*: import java util.*:

class Part {

public String toStringO {

return getClass().getSimpleName();

}

static List<Factory<? extends PartΒ» partFactories = new ArrayList<Factory<? extends PartΒ»0;

static {

// ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Collections addAllO выдаСтся ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ // "unchecked generic array creation for varargs parameter" partFactories.add(new Fuel Filter FactoryO). partFactories add(new AirFilter FactoryO), partFactories add(new CabinAirFilter.FactoryO), partFactories add(new Oil Filter FactoryO); partFactories add(new FanBelt FactoryO); partFactories.add(new PowerSteeringBelt.Factory()), partFactories add(new GeneratorBelt FactoryO),

}

private static Random rand = new Random(47);

public static Part createRandomO {

int n = rand nextInt(partFactories sizeO), return partFactories get(n) createO;

class Filter extends Part {}

class Fuel Filter extends Filter {

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°

public static class Factory

implements typeinfo factory.Factory<FuelFilter> {

public Fuel Filter createO { return new Fuel Filter О. }

}

}

class AirFilter extends Filter { public static class Factory implements typeinfo factory Factory<AirFilter> {

public AirFilter createO { return new AirFilterO. }

}

}

class CabinAirFiIter extends Filter { public static class Factory

implements typeinfo factory Factory<CabinAirFilter> { public CabinAi rFi Iter createO {

return new CabinAirFilter();

}

class Oil Filter extends Filter { public static class Factory implements typeinfo factory Factory<OilFilter> {

public Oil Filter createO { return new OilFilterO; }

}

}

class Belt extends Part {}

class FanBelt extends Belt {

public static class Factory

implements typeinfo.factory.Factory<FanBelt> {

public FanBelt createO { return new FanBeltO; }

}

}

class GeneratorBelt extends Belt { public static class Factory

implements typeinfo.factory.Factory<GeneratorBelt> { public GeneratorBelt createO {

return new GeneratorBeltO:

}

class PowerSteeringBelt extends Belt { public static class Factory

implements typei nfΠΎ.factory.Factory<PowerSteeri ngBelt> { public PowerSteeringBelt createO {

return new PowerSteeringBeltO;

}

}

}

public class RegisteredFactories {

public static void main(String[] args) { for(int i = 0; i < 10; i++)

System.out.pri ntin(Part.createRandom());

}

} /* Output: GeneratorBelt CabinAirFiIter GeneratorBelt AirFiIter PowerSteeringBelt CabinAirFiIter Fuel Filter PowerSteeringBelt PowerSteeringBelt Fuel Filter *///:-

He всС классы ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ рассчитаны Π½Π° созданиС экзСмпляров; Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ классы Filter ΠΈ Belt ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² цСлях классификации. ЭкзСмпляры этих классов Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΈΡ… субклассов. Если класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ посрСдством createRandom(), ΠΎΠ½ содСрТит Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ класс Factory.

Π₯отя для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ всСх Ρ„Π°Π±Ρ€ΠΈΠΊ Π² список ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Collections.addAll(), компилятор Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, поэтому я вСрнулся ΠΊ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ add(). ΠœΠ΅Ρ‚ΠΎΠ΄ createRandom() случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ ΠΈΠ· partFactories ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ create() для получСния Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Part.

instanceof ΠΈ сравнСниС Class

ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²Π°ΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ дСйствиС любой Ρ„ΠΎΡ€ΠΌΡ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° instanceof (Π±ΡƒΠ΄ΡŒ это сам ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ instanceof ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ isInstanceO ~~ ΠΎΠ½ΠΈ Π΄Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹) ΠΈ прямого сравнСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Class. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π² Ρ‡Π΅ΠΌ ΠΈΡ… различия:

//. typeinfo/FamilyVsExactType java // Различия ΠΌΠ΅ΠΆΠ΄Ρƒ instanceof ΠΈ class package typeinfo,

import static net mindview util.Print.*, class Base {}

class Derived extends Base {}

public class FamilyVsExactType { static void test(Object x) {

print ("ВСстируСм x Ρ‚ΠΈΠΏΠ° " + x.getClassO); printC'x instanceof Base " + (x instanceof Base)), printC'x instanceof Derived "+ (x instanceof Derived)); print("Base.isInstance(x) "+ Base.class.islnstance(x)); print("Derived islnstance(x) " +

Deri ved.class.i slnstance(x)); printC'x getClassO == Base.class " +

(x.getClassO == Base.class)); printC'x.getClassO == Derived.class " +

(x.getClassO == Deri ved. cl ass)). print("x.getClassO.equals(Base.class)) "+

(x getClassO .equals(Base.class))); printC'x getClassO equals (Deri ved. class)) " + (x.getClassO. equals (Deri ved. class)));

}

public static void main(String[] args) { test(new BaseO); test (new DerivedO),

}

} /* Output:

ВСстируСм x Ρ‚ΠΈΠΏΠ° class typeinfo.Base x instanceof Base true x instanceof Derived false Base islnstance(x) true Derived islnstance(x) false x getClassO == Base.class true x getClassO == Derived class false x getClassO equals(Base.class)) true x.getClassO equals(Derived.class)) false ВСстируСм x Ρ‚ΠΈΠΏΠ° class typeinfo.Derived x instanceof Base true x instanceof Derived true Base.islnstance(x) true Derived.islnstance(x) true x.getClassO == Base.class false x.getClassO == Derived class true x.getClassO equals(Base.class)) false x.getClassO.equals(Derived.class)) true *///:-

ΠœΠ΅Ρ‚ΠΎΠ΄ test() осущСствляСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ для этого ΠΎΠ±Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° instanceof. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ сравнСния ссылок == ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ equals(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Class Π½Π° ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠΏΡ€Π°Π²Π΅Π΄Π»ΠΈΠ²ΠΎΡΡ‚ΡŒ утвСрТдСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ дСйствиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° instanceof ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° islnstance() ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ. Π‘ΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния == ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° equals(). Но сами тСсты приводят ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ. Π’ соотвСтствии с ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠ° instanceof Π΄Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос: Β«ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ этому классу ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΡ‚ Π½Π΅Π³ΠΎ?Β» Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, сравнСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Class ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ == Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ наслСдования β€” Π»ΠΈΠ±ΠΎ Ρ‚ΠΈΠΏ Ρ‚ΠΎΡ‡Π½ΠΎ совпадаСт, Π»ΠΈΠ±ΠΎ Π½Π΅Ρ‚.

РСфлСксия: динамичСская информация ΠΎ классС

Если Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, RTTI сообщит Π²Π°ΠΌ Π΅Π³ΠΎ. Однако Π² этом случаС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ограничСния: Ρ‚ΠΈΠΏ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ извСстСн Π΅Ρ‰Π΅ Π²ΠΎ врСмя компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ RTTI ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ±ΠΎ всСх классах, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ Π·Π°Ρ‚Π΅ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ динамичСскоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² (RTTI).

Π‘Π½Π°Ρ‡Π°Π»Π° каТСтся, Ρ‡Ρ‚ΠΎ это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ сущСствСнно, Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ вас появилась ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ находится Π² пространствС вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, класс этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° нСдоступСн Π²ΠΎ врСмя Π΅Π΅ компиляции. НапримСр, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² с диска ΠΈΠ»ΠΈ ΠΈΠ· сСтСвого соСдинСния, ΠΈ Π²Π°ΠΌ сказали, Ρ‡Ρ‚ΠΎ эта ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прСдставляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ класс. Но компилятор Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π» ΠΎΠ± этом классС, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π» Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠ°ΠΊ ΠΆΠ΅ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ?

Π’ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… срСдах программирования такая Π·Π°Π΄Π°Ρ‡Π° показалась Π±Ρ‹ Π΄Π°Π»Π΅ΠΊΠΎΠΉ ΠΎΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Однако Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΌΠΈΡ€Π° программирования всС большС Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ΡΡ ΠΈ ΠΌΡ‹ всС Ρ‡Π°Ρ‰Π΅ встрСчаСмся с Ρ‚Π°ΠΊΠΈΠΌΠΈ ситуациями. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΠ΅ возмоТности Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎΠ³ΠΎ программирования, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слуТит основой для систСм быстрой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Rapid Application Development, RAD). Π­Ρ‚ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ для создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (экран прСдставлСн Π² Π²ΠΈΠ΄Π΅ Β«Ρ„ΠΎΡ€ΠΌΡ‹Β»), Π³Π΄Π΅ Π·Π½Π°Ρ‡ΠΊΠΈ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ. Π—Π°Ρ‚Π΅ΠΌ происходит настройка этих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΎΠ½ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ состояниС Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ состояниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… экзСмпляры, ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… содСрТимоС, ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ значСния. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ событий графичСского интСрфСйса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ систСма быстрой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠΌΠΎΠ³Π»Π° программисту Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ этих событий. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ рСфлСксии прСдоставляСт срСдства для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ доступных ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… ΠΈ ΠΈΡ… ΠΈΠΌΠ΅Π½Π°Ρ…. Π’Π°ΠΊΠΎΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ поддСрТиваСтся ΠΈ Π² Java, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ JavaBeans.

Другая ваТная прСдпосылка ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ динамичСской ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ классС β€” прСдоставлСниС возмоТности ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (Remote Method Invocation, RMI), позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° Java Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ свои ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ нСскольким машинам. ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ с интСнсивными вычислСниями ΠΌΠΎΠΆΠ½ΠΎ ΡΠ±Π°Π»Π°Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΠΎ доступным ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°ΠΌ. Иногда ΠΊΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, размСщаСтся Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° стала ΠΎΠ±Ρ‰ΠΈΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ Π»ΡŽΠ±Ρ‹Π΅ измСнСния ΠΊΠΎΠ΄Π° Π½Π° Ρ‚Π°ΠΊΠΎΠΉ машинС автоматичСски Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΠ»ΠΈΡΡŒ Π½Π° всСх ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² этого ΠΊΠΎΠ΄Π°. (Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ β€” ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ сущСствуСт ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ внСсСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС!) Ко всСму ΠΏΡ€ΠΎΡ‡Π΅ΠΌΡƒ распрСдСлСнноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ спСциализированноС ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ эффСктивно выполняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, β€” ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΈΡ… Π½Π° локальной машинС ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ слишком ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ рСсурсов.