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


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

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

12 51

12 ответов:

существует "стандартный" шаблон для геттеров и сеттеров в 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 для свойств типа boolean тоже, как в:

public boolean isAwesome();

public boolean hasAwesomeStuff();

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

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

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

@Getter @Setter int awesomeInteger = 5;

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

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

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

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

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/

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

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

возможно, Вам не нужны префиксы "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 будет автоматически генерировать getter и setter код для вас, если вы хотите, чтобы они. Существует несколько различных соглашений, и IDE, такая как Eclipse, позволит вам выбрать, какой из них вы хотите использовать, и даже позволить вам определить свой собственный.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

отправить мне письмо, если вы попробовать его и найти его полезным! -- Скотт

в java нет ключевого слова свойства (например, вы можете найти его в C#) ближайший способ получить 1 слово 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