2016-12-17 3 views
4

Я нашел следующую программу Озадачивающий:Расширение частного класса в Java

package package1; 

public class Main { 
    private static class A { } 

    public static class B extends A { } 
} 

// ---------------- 
package package2; 


public class Test { 
    public static void main(String[] args) { 
     Main.B b = new Main.B(); 
    } 
} 

Почему Java позволяет общественный класс B расширить частный класс A? На других языках, например. Класс C# может распространять только частный класс, когда он является частным.

Можете ли вы предоставить какой-либо сценарий, когда расширение частного класса может быть полезным?

+0

Другой вопрос, но правильный ответ: http://stackoverflow.com/questions/6987907/access-modifiers-for-inner-classes – BackSlash

+0

Если вы хотите использовать реальный прецедент, проверьте, почему существует 'java.lang. AbstractStringBuilder' в Oracle JDK. Это (package-) частный класс, используемый для обработки всей общей логики для 'StringBuffer' и' StringBuilder'. Все методы написаны в этом классе, и оба подкласса просто называть 'super' на них (для объяснения документации в обоих случаях и' synchronized' в случае 'StringBuffer'). Это позволяет писать логику только один раз и при этом представлять пользователю два разных API. –

ответ

1

Это позволит A быть деталью реализации (не подвергаться воздействию снаружи), но может быть повторно использована внутри (быть основой B). Пользователям B, что им небезразлично, B может выполнять все контракты, представленные его API. Тот факт, что внутренне B использует A для выполнения этих контрактов, не должен беспокоить любых внешних пользователей, верно ?.

Представьте, что может быть много других подклассов C, D, E, F и т. Д. A. Кодекс A может быть повторно использован ими.

+0

Если 'A' является деталью реализации, то он должен быть скрыт по композиции и/или делегированию. IMHO в примере, который вы предоставили, было бы лучше определить публичный интерфейс и частные реализации этого интерфейса, клиентские классы используют только интерфейс и действительно не знают о реализации. – csharpfolk

+1

Ну, конечно же! Это не значит, что это нужно. Java позволяет использовать его как расширение, поэтому при правильном использовании это хорошая функция. Не позже, чем 4 часа назад я написал общий скрытый родитель, чтобы не переписывать все мои методы снова и снова. Результат позволяет получить очень плавный и приятный API. –

0

Когда у вас есть функциональность, которая не имеет отношения к вашему классу, но не может стоять отдельно, например, события onclick и т. Д. ... вы создаете внутренний класс, потому что логика стоит только для этого класса. Помимо этого вы можете расширять и выполнять все, что требуется для вашей логики программы.

Также очень хороший вопрос OCP.

Смежные вопросы