Вопрос

Итак, до недавнего времени я намеренно сохранял себе Java n00b, и мое первое реальное знакомство вызвало небольшой шок:В Java нет свойств стиля C#!

Хорошо, я могу с этим жить.Однако я также могу поклясться, что видел код получения/установки свойств в Java в одной кодовой базе, но не могу вспомнить, где.Как это было достигнуто?Есть ли для этого языковое расширение?Это связано с NetBeans или чем-то еще?

Это было полезно?

Решение

В Java существует «стандартный» шаблон для геттеров и сеттеров, называемый Свойства компонента.В принципе любой метод, начинающийся с get, не принимающий аргументов и возвращающий значение, является методом получения свойства для свойства, имя которого совпадает с остальной частью имени метода (с начальной буквой в нижнем регистре).Так же set создает установщик метода void с одним аргументом.

Например:

// Getter for "awesomeString"
public String getAwesomeString() {
  return awesomeString;
}

// Setter for "awesomeString"
public void setAwesomeString( String awesomeString ) {
  this.awesomeString = awesomeString;
}

Большинство Java IDE сгенерируют эти методы для вас, если вы их попросите (в Eclipse это так же просто, как переместить курсор в поле и нажать ctrl-1, а затем выбрать опцию из списка).

Что бы это ни стоило, для удобства чтения вы можете использовать is и has на месте get для свойств логического типа, например:

public boolean isAwesome();

public boolean hasAwesomeStuff();

Другие советы

Я удивлен, что никто не упомянул проект Ломбок

Да, на данный момент в Java нет свойств.Есть и другие недостающие функции.
Но, к счастью, у нас есть проект Ломбок это попытка улучшить ситуацию.Кроме того, с каждым днем ​​он становится все более популярным.

Итак, если вы используете ломбок:

@Getter @Setter int awesomeInteger = 5;

Этот код будет генерировать getAwesomeInteger и setAwesomeInteger также.Так что это очень похоже на Автоматически реализуемые свойства C#.

Вы можете получить дополнительную информацию о геттерах и сеттерах ломбока. здесь.
Вам обязательно стоит проверить Другие особенности также.Мои любимые:

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

«Поддержка свойств Java» была предложена для Java 7, но не вошла в язык.

Видеть http://tech.puredanger.com/java7#property для получения дополнительных ссылок и информации, если интересно.

Соглашение о компоненте заключается в написании такого кода:

private int foo;
public int getFoo() {
    return foo;
}
public void setFoo(int newFoo) {
    foo = newFoo;
}

В некоторых других языках JVM, например Groovy, вы получаете переопределяемые свойства, аналогичные C#, например:

int foo

доступ к которому осуществляется с помощью простого .foo и использует дефолт getFoo и setFoo реализации, которые вы можете переопределить при необходимости.

public class Animal {

    @Getter @Setter private String name;
    @Getter @Setter private String gender;
    @Getter @Setter private String species;
}

Это что-то вроде свойств C#.Его http://projectlombok.org/

Возможно, вам не понадобятся префиксы «get» и «set», чтобы они больше напоминали свойства, вы можете сделать это следующим образом:

public class Person {
    private String firstName = "";
    private Integer age = 0;

    public String firstName() { return firstName; } // getter
    public void firstName(String val) { firstName = val; } // setter

    public Integer age() { return age; } // getter
    public void age(Integer val) { age = val; } //setter

    public static void main(String[] args) {
        Person p = new Person();

        //set
        p.firstName("Lemuel");
        p.age(40);

        //get
        System.out.println(String.format("I'm %s, %d yearsold",
            p.firstName(),
            p.age());
    }
}

Большинство IDE для Java автоматически генерируют для вас код получения и установки, если вы этого хотите.Существует множество различных соглашений, и такая IDE, как Eclipse, позволит вам выбрать, какое из них вы хотите использовать, и даже позволит вам определить свое собственное.

Eclipse даже включает автоматический рефакторинг, который позволит вам обернуть свойство в геттер и установщик, а также изменить весь код, который обращается к свойству напрямую, чтобы он использовал геттер и/или установщик.

Конечно, Eclipse может изменять только тот код, о котором ему известно — любые внешние зависимости, которые у вас есть, могут быть нарушены таким рефакторингом.

От Джеффри Рихтера книга CLR через C#:(Я думаю, что это могут быть причины, по которым свойства до сих пор не добавляются в JAVA)

  • Метод свойства может вызвать исключение;доступ к полю никогда не вызывает исключения.
  • Недвижимость не может быть передана в качестве out или ref параметр метода;поле может.
  • Выполнение метода свойства может занять много времени;Доступ к полю всегда завершается сразу.Общей причиной использования свойств является выполнение синхронизации потока, которая может навсегда остановить поток, и, следовательно, не следует использовать свойство, если требуется синхронизация потока.В этой ситуации предпочтительным является метод.Кроме того, если к вашему классу можно получить удаленный доступ (например, ваш класс является производным отSystem.MarshalByRefObject), вызов метода свойства будет очень медленным, и, следовательно, метод предпочтительнее свойства.По моему мнению, классы, производные отMarshalByRefObject никогда не следует использовать свойства.
  • Если вы называете несколько раз подряд, метод свойства может каждый раз возвращать различное значение;поле каждый раз возвращает одно и то же значение.А System.DateTime класс имеет доступ только для чтенияNow свойство, возвращающее текущую дату и время.Каждый раз, когда вы запрашиваете это свойство, оно возвращает другое значение.Это ошибка, и Microsoft желает, чтобы они могли исправить класс, сделав теперь метод вместо свойства. EnvironmentхTickCount собственность является еще одним примером этой ошибки.
  • Метод свойства может вызывать наблюдаемые побочные эффекты;доступ к полю никогда не делает.Другими словами, пользователь типа должен иметь возможность устанавливать различные свойства, определенные типом в любом порядке, который он или она выбирает, не замечая какого -либо другого поведения в этом типе.
  • Метод свойства может потребовать дополнительной памяти или вернуть ссылку на что -то, что на самом деле не является частью состояния объекта, поэтому изменение возвращаемого объекта не влияет на исходный объект;Запрос поля всегда возвращает ссылку на объект, который гарантированно будет частью состояния исходного объекта.Работа с свойством, которое возвращает копию, может быть очень запутанной для разработчиков, и эта характеристика часто не задокументирована.

Мой опыт работы с Java тоже не так уж высок, поэтому кто-нибудь может меня поправить.Но AFAIK, общее соглашение состоит в том, чтобы написать два таких метода:

public string getMyString() {
    // return it here
}

public void setMyString(string myString) {
    // set it here
}

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

Я просто выпускаю аннотации Java 5/6 и процессор аннотаций, чтобы помочь в этом.

Проверить http://code.google.com/p/javadude/wiki/Аннотации

Документация сейчас немного упрощена, но быстрая ссылка должна передать идею.

По сути, он генерирует суперкласс с геттерами/сеттерами (и многими другими вариантами генерации кода).

Пример класса может выглядеть так

@Bean(properties = {
    @Property(name="name", bound=true),
    @Property(name="age,type=int.class)
})
public class Person extends PersonGen {
}

Доступно гораздо больше примеров, и в сгенерированном коде нет зависимостей времени выполнения.

Напишите мне, если вы попробуете это и найдете это полезным!-- Скотт

В Java нет ключевого слова свойства (например, вы можете найти его в С#). Самый близкий способ получить 1 слово для получения/установки - это сделать, как в С++:

public class MyClass
{
    private int aMyAttribute;
    public MyClass()
    {
        this.aMyAttribute = 0;
    }
    public void mMyAttribute(int pMyAttributeParameter)
    {
        this.aMyAttribute = pMyAttributeParameter;
    }
    public int mMyAttribute()
    {
        return this.aMyAttribute;
    }
}
//usage :
int vIndex = 1;
MyClass vClass = new MyClass();
vClass.mMyAttribute(vIndex);
vIndex = 0;
vIndex = vClass.mMyAttribute();
// vIndex == 1

Как упоминалось ранее для eclipse, интегрированная среда разработки (IDE) часто может автоматически создавать методы доступа.

Вы также можете сделать это с помощью NetBeans.

Чтобы создать методы доступа для вашего класса, откройте файл класса, затем щелкните правой кнопкой мыши в любом месте редактора исходного кода и выберите команду меню «Рефакторинг», «Инкапсулировать поля».Откроется диалоговое окно.Нажмите «Выбрать все», затем нажмите «Рефакторинг».Вуаля,

Удачи,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top