2015-12-18 4 views
-5

Я работаю над проектом, который использует ASM-5 для чтения файлов классов и создания UML-диаграмм. Я столкнулся с проблемой при тестировании, чтобы убедиться, что мы правильно прочитали. Я тестирую это в классе String. Единственное поле, которое отображается в документации, - CASE_INSENSITIVE_ORDER. Это уже показалось мне подозрительным, но я написал свои тесты, чтобы проверить, было ли это поле и только это поле было прочитано, и появилось 5 полей: value: char [], hash: int, serialVersionUID: long, serialPersistentField: ObjectStreamField и CASE_INSENSITIVE_ORDER: Компаратор.Какие частные поля имеют java?

Откуда взялись эти 4 дополнительных поля и почему они не указаны в документации о оракуле? Я также не мог получить к ним доступ, когда пытался использовать рефлексию, чтобы посмотреть, какие поля имеет класс строк (я мог видеть только CASE_INSENSITIVE_ORDER). Это похоже на то, что должно быть более хорошо документировано.

+7

Зачем нужны поля 'private' в документации? Это детали реализации, а не часть API. –

+0

Документация предназначена для использования класса, поэтому вы не включаете в него личные поля. Если вы хотите узнать о деталях реализации, вы можете посмотреть [код] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/ String.java?av=f). – azurefrog

+0

См. Также: [Инкапсуляция] (https://en.wikipedia.org/wiki/Encapsulation_ (computer_programming)). – Powerlord

ответ

0

В Java 8 (она отличается в других версиях), String имеет следующие поля (выровнены для удобства):

public static final Comparator<String> CASE_INSENSITIVE_ORDER; 
private static final ObjectStreamField[] serialPersistentFields; 
private static final long    serialVersionUID; 

private  int hash; 
private final char[] value; 

Как вы можете видеть, только один из них является public, и 3 из них static.

В зависимости от того, что вы хотите показать диаграмму UML, вам также нужно найти поля private, и вы можете исключить поля static.

На самом деле, хорошая практика программирования означает, что вы никогда не найдете поле public, а не static.

+0

Из этих переменных: две статические переменные предназначены для сериализации. Одной из статических переменных является Компаратор для .equalsIgnoreCase. Одной из переменных является хэш-код для '.getHashCode'. Одной из этих переменных является массив поддержки для фактического 'String'. – Powerlord

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