Scala: Могу ли я объявить публичное поле, которое не будет генерировать геттеры и сеттеры при компиляции?

В Scala, когда вы объявляете val или var, Scala автоматически сгенерирует приватное поле и получатели и сеттеры для вас при компиляции в байт-код.

например.

class myClass {
    val name = "My Name"
}

будет компилироваться для создания эквивалентного

class myClass {
    private string name;
    public string name();
    public void name_$eq(string);
}

Если name() и name_ $eq - это геттеры и сеттеры для имени частной строки.

Я знаю, что вы можете заставить его не предоставлять геттеры и сеттеры для частных полей, объявляя их как private [это] val/var blah, но мне нужно создать публичное поле, которое не генерирует геттеры и сеттеры при компиляции.

Возможно ли это в Scala?

Спасибо

Ответы

Ответ 1

Сгенерированный класс не содержит геттеров или сеттеров, как можно видеть в предоставленном вами образце. Сгенерированные классы не содержат java bean геттеров или сеттеров. Чтобы на самом деле заставить компилятор генерировать методы getX и setX для var, вам нужно аннотировать эту переменную с помощью @BeanProperty.

Если вы хотите, чтобы открытое поле было доступно из java, я думаю, что вам не повезло, к сожалению. По крайней мере, я не видел способ сделать это, используя только scala.

Вы можете выполнить это, смешав scala и java. С классом java, например:

public abstract class JavaClassWithPublicField {
   public String name = "My name";
}

И затем в вашем коде scala наследуйте этот класс:

class ScalaClassWithPubilcField extends JavaClassWithPublicField

Скорее всего, это самый чистый способ сделать это.

Ответ 2

Предположительно, вы хотите, чтобы ваш атрибут был представлен, потому что вы получаете доступ к Java. (Если вы пытаетесь "оптимизировать" ваш байт-код, избавившись от геттера, тогда вы теряете время, VM быстро включит их.) К сожалению для вас, чтобы держать дверь как можно более открытой для будущего улучшения, Scala specs не указывают, как код Scala должен быть переведен в байтовый код. Это означает, что даже если вы найдете трюк, который работает для данной версии Scala, он не гарантирует работу в последующих версиях.

Рекомендуемый подход в этих случаях - написать Java-видимый код на Java, а затем иметь небольшой класс клея, написанный в Scala - что-то вроде ответа, данного @Emil, отлично.