Инициализация массива статических объектов в Java
В C++ общеизвестной и полезной практикой является использование списка инициализации для задания значений массива. При этом крайне удобно инициализировать при помощи фигурных скобок объекты в которых поля являются открытыми. Это либо структуры(struct) либо классы, у которых все поля открыты(перед ними указан access specifier как public).
Рассмотрим обычную структуру :
struct my_unary_function {
string name;
string detect_name;
double (*handler) (double);
};
Объекты можно создавать и инициализировать на лету(конструктор нам не нужен!) :
my_unary_function sin_func = {"Синус", "sin", sin};
Обратите внимание на синтаксис - во-первых, наличие фигурных скобок. Во-вторых - строгий порядок перечисления значений , соответствующий порядку определения переменных в структуре. У нового объекта - name=”Синус”, detec_name=”sin”, handler=”&sin”.
Теперь, собственно массивы, которые удобно инициализировать также как объекты :
my_unary_function math_functions[] = {
{"Синус", "sin", sin},
{"Косинус", "cos", cos},
{"Тангенс", "tan", tan}
};
Добавив всего-лишь одну строчку расширится функционал программы. Если пишется калькулятор с поддержкой простейших математических вычислений - то все функции можно определять по полю detect_name в этом массиве, а обработчик определяется полем handler.
Java - встроенная инициализация статических массивов из объектов. В Java - немного другая история. Чаще всего используются статические массивы, тип элементов которых объявлен рядом с ними.
Пример такого определения :
public class InnerClassTest {
static class Employee {
private String name;
private double salary;
public Employee(String n, double s) {
name = n;
salary = s;
}
public void print() {
System.out.println(name + " " + salary);
}
}
static Employee[] staff = new Employee[] {
new Employee("Harry Hacker", 3500),
new Employee("Carl Cracker", 7500),
new Employee("Tony Tester", 3800),
};
public static void main(String[] args) {
for (Employee e: staff) {
e.print();
}
}
}
А можно было бы разделить инициализацию и поместить её в специальный static-блок :
public class Main {
static Integer[] integerArray;
static {
integerArray = new Integer[] { new Integer(1), new Integer(2) };
}
public static void main(String args[]) {
for (int i = 0; i < integerArray.length; i++) {
System.out.println(integerArray[i]);
}
}
}
Такой static-блок является функциональным блоком и в нём также можно выполнять любые действия :
static ArrayList<String> list = new ArrayList<String>();
static {
list.add("Bart");
list.add("Lisa");
list.add("Marge");
list.add("Barney");
list.add("Homer");
list.add("Maggie");
System.out.print("Hello!");
}
На самом деле для инициализации ArrayList можно использовать метод java.util.Arrays.asList :
public static final List<String> favorites =
Arrays.asList("EJB", "JPA", "Glassfish", "NetBeans");