it-swarm-ru.tech

(нет) свойства в Java?

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

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

54
Ishmaeel

В 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();
61
Calum

Я удивлен, что никто не упомянул project lombok

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

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

@Getter @Setter int awesomeInteger = 5;

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

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

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

31
Aleks-Daniel Jakimenko-A.

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

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

6
Cheekysoft

Соглашение bean-компонента состоит в том, чтобы писать код следующим образом:

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

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

int foo

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

6
Hank Gay
public class Animal {

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

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

6
dantuch

Вам могут не понадобиться префиксы «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());
    }
}
4
LEMUEL ADANE

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

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

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

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

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

3
Bill Michell

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

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

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

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

Проверьте http://code.google.com/p/javadude/wiki/Annotations

Документация немного легковесна, но быстрое руководство должно донести идею.

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

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

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

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

Отправьте мне письмо, если вы попробуете это и сочтете это полезным! -- Скотт

1
Scott Stanchfield

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

1
TK.

В Java нет ключевого слова свойства (как вы могли бы найти его в C #), ближайший способ получить 1 Word getter/setter - сделать так же, как в C++:

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
1
Patrick PIGNOL

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

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

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

Удачи,

0
levteck