program tip

(아니오) Java의 속성?

radiobox 2021. 1. 6. 08:00
반응형

(아니오) Java의 속성?


그래서 저는 최근까지 고의로 Java n00b를 유지해 왔으며, 첫 번째 실제 노출은 약간의 충격을 받았습니다. Java에는 C # 스타일 속성이 없습니다!

좋아, 나는 그것으로 살 수있다. 그러나 하나의 코드베이스에서 Java의 속성 getter / setter 코드를 보았다고 맹세 할 수 있지만 어디에 있는지 기억할 수 없습니다. 어떻게 이루어 졌습니까? 그것에 대한 언어 확장이 있습니까? NetBeans와 관련이 있습니까?


Java의 getter 및 setter에 대한 "표준"패턴이 있으며 Bean 속성 이라고 합니다 . 기본적으로으로 시작하고 get인수를 취하지 않고 값을 반환하는 모든 메서드 는 나머지 메서드 이름 (소문자 시작 문자 사용)으로 명명 된 속성에 대한 속성 getter입니다. 마찬가지로 set단일 인수로 void 메서드의 setter를 만듭니다.

예를 들면 :

// 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에는 속성이 없습니다. 다른 누락 된 기능도 있습니다.
하지만 운 좋게도 상황을 개선하려는 프로젝트 롬복 이 있습니다. 또한 매일 점점 인기를 얻고 있습니다.

따라서 lombok을 사용하는 경우 :

@Getter @Setter int awesomeInteger = 5;

이 코드는 생성하는 것입니다 getAwesomeIntegersetAwesomeInteger뿐만 아니라. 따라서 C # 자동 구현 속성 과 매우 유사 합니다 .

여기에서 롬복 게터 및 세터에 대한 자세한 정보를 얻을 수 있습니다 . 다른 기능
확인해야 합니다. 내가 가장 좋아하는 것은 :

Lombok은 IDE와 잘 통합되어 있으므로 생성 된 메서드가 존재하는지 여부 (제안, 클래스 내용, 선언 및 리팩토링으로 이동)를 표시합니다.
롬복의 유일한 문제점은 다른 프로그래머가 알지 못할 수도 있다는 것입니다. 당신은 항상 코드를 delombok 할 수 있지만 그것은 해결책 이라기보다는 차선책입니다.


"Java Property Support"는 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기본 getFoosetFoo구현을 활용 합니다.


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());
    }
}

Most IDEs for Java will automatically generate getter and setter code for you if you want them to. There are a number of different conventions, and an IDE like Eclipse will allow you to choose which one you want to use, and even let you define your own.

Eclipse even includes automated refactoring that will allow you to wrap a property up in a getter and setter and it will modify all the code that accesses the property directly, to make it use the getter and/or setter.

Of course, Eclipse can only modify code that it knows about - any external dependencies you have could be broken by such a refactoring.


From Jeffrey Richter's book CLR via C#: (I think these might be the reasons why properties are still not added in JAVA)

  • A property method may throw an exception; field access never throws an exception.
  • A property cannot be passed as an out or ref parameter to a method; a field can.
  • A property method can take a long time to execute; field access always completes immediately. A common reason to use properties is to perform thread synchronization, which can stop the thread forever, and therefore, a property should not be used if thread synchronization is required. In that situation, a method is preferred. Also, if your class can be accessed remotely (for example, your class is derived from System.MarshalByRefObject), calling the property method will be very slow, and therefore, a method is preferred to a property. In my opinion, classes derived from MarshalByRefObject should never use properties.
  • If called multiple times in a row, a property method may return a different value each time; a field returns the same value each time. The System.DateTime class has a readonly Now property that returns the current date and time. Each time you query this property, it will return a different value. This is a mistake, and Microsoft wishes that they could fix the class by making Now a method instead of a property. Environment’s TickCount property is another example of this mistake.
  • A property method may cause observable side effects; field access never does. In other words, a user of a type should be able to set various properties defined by a type in any order he or she chooses without noticing any different behavior in the type.
  • A property method may require additional memory or return a reference to something that is not actually part of the object’s state, so modifying the returned object has no effect on the original object; querying a field always returns a reference to an object that is guaranteed to be part of the original object’s state. Working with a property that returns a copy can be very confusing to developers, and this characteristic is frequently not documented.

My Java experience is not that high either, so anyone feel free to correct me. But AFAIK, the general convention is to write two methods like so:

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

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

If you're using eclipse then it has the capabilities to auto generate the getter and setter method for the internal attributes, it can be a usefull and timesaving tool.


I'm just releasing Java 5/6 annotations and an annotation processor to help this.

Check out http://code.google.com/p/javadude/wiki/Annotations

The documentation is a bit light right now, but the quickref should get the idea across.

Basically it generates a superclass with the getters/setters (and many other code generation options).

A sample class might look like

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

There are many more samples available, and there are no runtime dependencies in the generated code.

Send me an email if you try it out and find it useful! -- Scott


There is no property keyword in java (like you could find it in C#) the nearest way to have 1 word getter/setter is to do like in 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

As previously mentioned for eclipse, integrated development environment (IDE) often can create accessor methods automatically.

You can also do it using NetBeans.

To create accessor methods for your class, open a class file, then Right-click anywhere in the source code editor and choose the menu command Refactor, Encapsulate Fields. A dialog opens. Click Select All, then click Refactor. Voilà,

Good luck,

ReferenceURL : https://stackoverflow.com/questions/70471/no-properties-in-java

반응형