Подтвердить что ты не робот

У нас есть поле Readonly в java (которое задано в рамках самого класса)?

Как мы можем иметь переменную, которая доступна для записи внутри класса, но только "читаемая" вне нее?

Например, вместо этого:

Class C {
  private int width, height;

  int GetWidth(){
    return width;
  }

  int GetHeight(){
    return height;
  }

  // etc..

Я хотел бы сделать что-то вроде этого:

Class C {
  public_readonly int width, height;

  // etc...

Какое лучшее решение?

4b9b3361

Ответ 1

В Java нет возможности сделать это.

Два ваших варианта (один из которых вы упомянули) используют публичные геттеры и делают поле приватным или тщательную документацию в классе.

Накладные расходы на методы получения в чрезвычайно малом (если вообще). Если вы делаете это много раз, вы можете захотеть кэшировать извлеченное значение вместо вызова метода get.

EDIT:

Один из способов сделать это, хотя он имеет еще больше накладных расходов, чем getter, определяет внутренний внутренний класс (пусть его называют innerC) конструктором, доступным только для вашего класса C, и сделайте свой поля открыты. Таким образом, вы не можете создавать экземпляры innerC вне вашего класса, поэтому изменение полей извне невозможно, но вы можете изменить их изнутри. Однако вы могли читать их снаружи.

Ответ 2

Создайте класс с полями public final. Предоставьте конструктор, в котором эти поля будут инициализированы. Таким образом, ваш класс будет неизменным, но у вас не будет накладных расходов на доступ к значениям извне. Например:

public class ShortCalendar
{
    public final int year, month, day;

    public ShortCalendar(Calendar calendar)
    {
        if (null == calendar)
            throw new IllegalArgumentException();

        year = calendar.get(Calendar.YEAR);
        month = calendar.get(Calendar.MONTH);
        day = calendar.get(Calendar.DATE);
    }
}

Ответ 3

из того, что я знаю, компилятор не оптимизирует этот тип кода

Компилятор Hotspot JIT наиболее определенно работает.

Мне было интересно, какое лучшее решение?

Остановить оптимизацию преждевременно. Если вы используете этот код в рутине рисования, я могу гарантировать, что фактическая картина займет как минимум сто раз дольше, чем вызов тривиального метода, даже если он не встроен.

Ответ 4

нет способа сделать поле "только для чтения" извне. единственное и правильное - это сделать поля частными и предоставлять только геттеры, без сеттеров.

Ответ 5

На самом деле компилятор HotSpot, скорее всего, будет использовать встроенные вызовы для ваших геттеров, поэтому не будет задействован служебный вызов (кроме того, накладные расходы для вызова этих методов вряд ли будут измеримы).

ИЗМЕНИТЬ

Если вам действительно нужен каждый цикл процессора, используйте C или С++ (или напишите в нем критически важные для него компоненты и вызовите его через JNA, хотя маловероятно, что это будет стоить потраченного времени).

Ответ 6

Ваше решение: частные поля, частные сеттеры, защищенные или публичные геттеры (примечание: protected разрешает доступ из одного и того же пакета, а также из подклассов)