Внутренний класс связан с экземпляром внешнего класса и есть два специальных вида: Локальный класс и Анонимный класс . Анонимный класс позволяет нам объявлять и создавать экземпляр класса одновременно, поэтому делает код кратким. Мы используем их, когда нам нужен локальный класс только один раз, поскольку у них нет имени.
Рассмотрим пример из doc , где мы имеем класс Person
:
public class Person {
public enum Sex {
MALE, FEMALE
}
String name;
LocalDate birthday;
Sex gender;
String emailAddress;
public int getAge() {
// ...
}
public void printPerson() {
// ...
}
}
, и у нас есть способ печати элементов, которые соответствуют критериям поиска:
public static void printPersons(
List roster, CheckPerson tester) {
for (Person p : roster) {
if (tester.test(p)) {
p.printPerson();
}
}
}
, где CheckPerson
- это интерфейс, такой как:
interface CheckPerson {
boolean test(Person p);
}
Теперь мы можем использовать анонимный класс, который реализует этот интерфейс, чтобы указать критерии поиска как:
printPersons(
roster,
new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
}
);
. Здесь интерфейс очень прост, и синтаксис анонимного класса кажется громоздким и непонятным.
В Java 8 введен термин функциональный интерфейс , который является интерфейсом только с одним абстрактным методом, поэтому можно сказать, CheckPerson
является функциональным интерфейсом. Мы можем использовать выражение Lambda Expression , которое позволяет нам передать функцию как аргумент метода как:
printPersons(
roster,
(Person p) -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
);
Вместо стандартного функционального интерфейса Predicate
мы можем использовать интерфейс CheckPerson
, что дополнительно уменьшит требуемый код.
В XAML имеется некоторая поддержка условной компиляции . Однако это не то же самое, что в C #, код. Уловка состоит в том, чтобы использовать AlternateContent
с Requires
против чего-то помеченного Ignorable . Поступая так, вы можете фактически сделать части вашего xaml недоступными в зависимости от условий, а также включить или выключить их.