Вход/Регистрация
Философия Java3
вернуться

Эккель Брюс

Шрифт:

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 *///:-

  • Читать дальше
  • 1
  • ...
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: