Вот что происходит:
Recreate.Car.TESLA
enum Car
. Как отмечено ниже, класс Recreate
еще не загружен или не инициализирован. TESLA
относится к FEATURES
Recreate
и initialized Recreate
, загружается класс Garage
, инициализируется и создается экземпляр ONE_CAR_GARAGE
. Проблема здесь что в этой точке конструкция enum Car
не является полной, а Car.TESLA
имеет значение null
.
Несмотря на то, что классы могут быть вложенными, это не тот случай, когда вложенные классы загружаются и инициализируются как часть инициализации внешнего класса. Они могут выглядеть вложенными в источник, но каждый класс независим. Статические вложенные классы эквивалентны классам верхнего уровня. Нестатические классы также совпадают, но имеют возможность ссылаться на членов в содержащем классе через скрытую ссылку.
Вы можете сами убедиться, если вы запустили это в отладчике, поставили точки останова в нескольких местах и исследовали стек на каждой точке останова.
Я тестировал / отлаживал это в Eclipse с помощью следующий код, с установленными точками останова, где указано. Он немного отличается от вашего кода, но не должен вести себя по-другому:
public class Foo5
{
static class Recreate {
private static ArrayList FEATURES = new ArrayList();
public enum Car {
TESLA(FEATURES);
Car(ArrayList l) {
System.out.println("car"); // *** Breakpoint ***
}
}
public static Garage ONE_CAR_GARAGE = new Garage(Car.TESLA);
public static class Garage {
final Car car;
Garage(Car car) {
this.car = car; // *** Breakpoint ***
}
}
}
public static void main(String[] args) throws Exception {
Recreate.Car car = Recreate.Car.TESLA;
System.out.println(Recreate.Car.TESLA);
System.out.println(Recreate.ONE_CAR_GARAGE.car.toString());
}
}
Первая точка останова, на которую вы нажмете, будет таковой в конструкторе Garage(Car car)
. Изучив стек в этой точке, вы увидите
Foo5$Recreate$Garage.<init>(Foo5$Recreate$Car) line: 23
Foo5$Recreate.<clinit>() line: 17
Foo5$Recreate$Car.<clinit>() line: 12
Foo5.main(String[]) line: 29
. Поэтому, когда вызывается конструктор Garage
, он еще не вернулся из создания Car
. Это диктуется запутанными зависимостями, которые вы создали между классами, поэтому решение заключается в распутывании зависимостей. Как вы это сделаете, это будет зависеть от ваших конечных целей.
На типы ссылаются, используя пространство имен и имя типа, а не через физические пути к файлам.
Таким образом, чтобы сослаться на тип Proj.Views.Dashboard
, добавьте соответствующее пространство имен в качестве объявления пространства имен XML и используйте его в атрибуте TargetType, например,
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Proj.Styles"
xmlns:views="clr-namespace:Proj.Views" >
<Style x:Key="MyWindowStyle" TargetType="views:Dashboard">
....
....
</Style>
</ResourceDictionary>