Z robotniczym pozdrowieniem!
Przeglądam kod dołączony do JDK 8 i znalazłem tam forkjoin -> mergesort. Gołym okiem widzę, jak program dobiera się do atrybutów prywatnych objektu. Jak to możliwe, że to działa? Wg. mnie to nie powinno się dać skompilować.
Tenże MergeSort robi co następuje:
public static void main(String[] args) {
Configuration configuration = Configuration.parse(args);
if (configuration == null) {
System.exit(1);
}
System.out.println(configuration);
new MergeDemo().run(configuration);
}
Jeśli się przyjrzeć MergeDemo.run:
private void run(Configuration config) {
Range sizes = config.sizes;
Range parallelism = config.parallelism;
// Tu program robi dalsze rzeczy, nieistotne dla problemu
}
}
Tymczasem objekt Configuration jest zdefiniowany:
private static class Configuration {
private final Range sizes;
private final Range parallelism;
private Configuration(Range sizes, Range parallelism) {
this.sizes = sizes;
this.parallelism = parallelism;
}
public static Configuration parse(String[] args) {
// standardowy parser z lini poleceń
}
}
Moim problemem jest dostęp do config.sizes i config.parallelism - dlaczego mogą one zostać wywołane z MergeDemo.run, skoro są zadeklarowane jako private? Nie muszą być public, albo przez public Range getSizes() ?