Должен ли конструктор частного внутреннего класса быть объявлен открытым или закрытым?

Есть ли какая-либо фактическая разница между этим

public class OuterClass {
    private class InnerClass {
        public InnerClass() {}
    }
}

и это?

public class OuterClass {
    private class InnerClass {
        private InnerClass() {}
    }
}

Ответ 1

Доступ к закрытым членам другого класса несколько усложняется, потому что JVM на самом деле этого не позволяет. В результате компилятор вводит методы доступа, которые делают его несколько медленнее или сложнее трассировка стека.

По этой причине я оставляю его как локальный пакет.

BTW Конструктор abstract class не должен быть public. Это может быть также protected или локальный пакет

private static class A {
    private A() {
        throw new Error();
    }
}
public static void main(String... ignored) {
    new A();
}

печатает дополнительный элемент трассировки стека.

Exception in thread "main" java.lang.Error
    at Main$A.<init>(Main.java:8)
    at Main$A.<init>(Main.java:6)
    at Main.main(Main.java:12)

Сделать пакет конструктора локальным, а второй - исчезнуть.

Ответ 2

Что касается других классов, это не должно происходить, поскольку внутренний класс объявляется закрытым. Они вообще этого не видят.

Он не должен иметь никакого отношения к охватывающему классу, так как он содержит внутренний класс.