Пожалуйста, посмотрите пример ImagesInChunkInCell . Вместо пули я взял изображение лампочки. Я смог воспроизвести описанную вами проблему, но, как вы можете видеть в list_with_images.pdf , мне удалось добавить одну дополнительную строку:
Image image = Image.getInstance(IMG);
image.setScaleToFitHeight(false);
PdfPTable table = new PdfPTable(1);
table.setTotalWidth(new float[]{120});
table.setLockedWidth(true);
Phrase listOfDots = new Phrase();
for (int i = 0; i < 40; i++) {
listOfDots.add(new Chunk(image, 0, 0));
listOfDots.add(new Chunk(" "));
}
table.addCell(listOfDots);
Дополнительная строка :
image.setScaleToFitHeight(false);
Это предотвращает масштабирование изображения.
Переменная только для чтения очень похожа на const в том смысле, что значение является постоянным на протяжении всего срока службы. Разница в том, что переменная только для чтения инициализируется во время выполнения, а const - во время компиляции. Статический , в смысле терминов непрофессионалов, означает, что экземпляр переменной не зависит от экземпляра объекта, в котором она объявлена. Время ее существования сохраняется от вызова функции до вызова функции. Статическая переменная быстрее доступна, потому что ее хранилище остается выделенным на весь период действия программы. Итак, зная это, мы можем вернуться к вашему вопросу.
Почему «логгер» является статическим членом? Это дизайнерское решение. Мне нужно знать, как вы используете это, чтобы ответить на этот вопрос. Почему это только для чтения? Потому что кажется, что он инициализирован один раз, а его экземпляр используется повсеместно. Мы можем быть уверены, что никто больше не повлияет на значение logger, сделав его доступным только для чтения сразу после его инициализации.
Статические переменные попадают в категорию «переменных класса», переменная класса - это переменная класса, связанная с классом вместо объекта класса, с другой стороны переменные экземпляра являются переменными, которые связаны с объектом класса, то есть каждый раз, когда объект класса При инициализации этот объект будет иметь свою собственную копию этой «переменной экземпляра» (не статичную), в то время как статическая переменная является общей для всех объектов классов в запущенной программе, таких как размер связанного списка и т. д. Java не предоставляет такой возможности, что вам нужно написать публичный метод для доступа к переменным, которые вы не хотите отпускать.
Я думаю, вы неправильно понимаете статику. Статический не означает, что «нельзя использовать вне файла». Статический означает: по одному на класс. Это объявление создает регистратор, который выделяется только один раз (статический), доступен только в классе (не в производных классах) (закрытый) и не может быть записан после его инициализации (только для чтения).
Хороший вопрос хотя!
static not означает, что к нему нельзя получить доступ из других файлов - это не C. Ключевое слово static означает, что объект регистратора является переменной класса, а не переменная экземпляра, поэтому даже при доступе из разных объектов этого класса все они будут ссылаться на один и тот же объект регистратора.
static в C # означает, что член связан с классом, а не с экземпляром класса. Только чтение важно, потому что в C # большинство переменных, и эта, в частности, являются ссылочными. Только чтение означает, что эта переменная всегда будет ссылаться на один и тот же регистратор.
Разработчик говорит, что когда они вызывают logger.Info (...) в любом экземпляре этого класса, они хотят использовать общий (статический) экземпляр (поэтому не нужно для создания нового регистратора для каждого экземпляра класса), они хотят быть уверены, что он не изменился с момента его создания (только для чтения), и если мы находимся в виртуальной функции в производном классе, я хочу убедиться, что я не использую базовый класс один по ошибке (частный).
Причина установки флага только для чтения в приватной переменной состоит в том, чтобы объявить, что переменная всегда будет ссылаться на один и тот же объект. Это правда, что приватность делает ее невидимой для кого-либо вне класса, но таким образом мы можем убедиться, что случайно не перезаписали переменную новым объектом, написав что-то вроде
logger = LogManager.GetLogger(typeof(AdminClient));
где-нибудь в другом месте нашего класса. С readonly он просто не будет компилироваться (если он не был инициализирован раньше, и мы находимся в (статическом) конструкторе)