it-swarm-ko.com

(아니) Java의 속성?

그래서, 나는 고의적으로 자신을 Java n00b까지 최근까지 유지했으며, 첫 번째 실제 노출은 약간의 충격을 일으켰습니다. Java C # 스타일 속성이 없습니다!

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

55
Ishmaeel

Java에서 getter 및 setter에 대한 "표준"패턴이 있으며 Bean properties 입니다. 기본적으로 인수를 취하지 않고 값을 반환하는 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();
63
Calum

아무도 언급하지 않은 것에 놀랐습니다 프로젝트 롬복

예, 현재 Java에는 속성이 없습니다. 다른 누락 된 기능도 있습니다.
운 좋게도 상황을 개선하려는 project lombok 이 있습니다. 또한 매일 점점 더 인기를 얻고 있습니다.

롬복을 사용하는 경우 :

@Getter @Setter int awesomeInteger = 5;

이 코드는 getAwesomeIntegersetAwesomeInteger도 생성합니다. 따라서 C # 자동 구현 속성 과 매우 유사합니다.

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

롬복은 IDE와 잘 통합되어 있으므로 생성 된 메서드 (제안, 클래스 내용, 선언 및 리팩토링으로 이동)와 같은 생성 된 메서드를 보여줍니다.
롬복의 유일한 문제는 다른 프로그래머가 모르는 것입니다. 항상 delombok 코드를 사용할 수 있지만 솔루션보다는 해결 방법입니다.

Java 7 "에 대해"Java 속성 지원 "이 제안되었지만 언어로 만들지 않았습니다.

관심이있는 경우 더 많은 링크 및 정보는 http://tech.puredanger.com/Java7#property 를 참조하십시오.

8
Cheekysoft

빈 규칙은 다음과 같은 코드를 작성하는 것입니다.

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

JVM의 다른 언어 (예 : Groovy)에서는 C #과 유사한 재정의 가능한 속성 (예 :

int foo

간단한 .foo 및 필요한 경우 재정의 할 수있는 기본 getFoosetFoo 구현을 활용합니다.

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

Jeffrey Richter 's book C #을 통한 CLR : (이것이 Java에서 속성이 여전히 추가되지 않는 이유 일 수 있습니다)

  • 속성 메소드는 예외를 던질 수 있습니다. 필드 액세스는 예외를 발생시키지 않습니다.
  • 속성은 out 또는 ref 매개 변수로 메서드에 전달할 수 없습니다. 필드 캔.
  • 속성 메서드를 실행하는 데 시간이 오래 걸릴 수 있습니다. 현장 접근은 항상 즉시 완료됩니다. 속성을 사용하는 일반적인 이유는 스레드 동기화를 수행하여 스레드를 영구적으로 중지 할 수 있기 때문에 스레드 동기화가 필요한 경우 속성을 사용해서는 안됩니다. 그러한 상황에서는 방법이 선호됩니다. 또한 클래스에 원격으로 액세스 할 수있는 경우 (예 : 클래스는 System.MarshalByRefObject), 속성 메소드 호출은 매우 느리므로, 메소드가 메소드보다 선호됩니다. 제 생각에는 MarshalByRefObject에서 파생 된 클래스는 속성을 사용해서는 안됩니다.
  • 행에서 여러 번 호출되면 속성 메서드는 매번 다른 값을 반환 할 수 있습니다. 필드는 매번 같은 값을 반환합니다. System.DateTime 클래스에는 현재 날짜와 시간을 반환하는 읽기 전용 Now 속성이 있습니다. 이 속성을 쿼리 할 때마다 다른 값이 반환됩니다. 이것은 실수이며 Microsoft는 Now 대신 속성 대신 메서드를 만들어 클래스를 수정할 수 있기를 바랍니다. EnvironmentTickCount 속성이이 실수의 또 다른 예입니다.
  • 속성 방법은 관찰 가능한 부작용을 일으킬 수 있습니다. 현장 접근은 절대하지 않습니다. 즉, 유형의 사용자는 유형의 다른 동작을 눈치 채지 않고 선택한 순서에 따라 유형에 의해 정의 된 다양한 속성을 설정할 수 있어야합니다.
  • 속성 메서드는 추가 메모리가 필요하거나 실제로 객체 상태의 일부가 아닌 것에 대한 참조를 반환 할 수 있으므로 반환 된 객체를 수정해도 원래 객체에는 영향을 미치지 않습니다. 필드를 쿼리하면 항상 원래 개체 상태의 일부인 개체에 대한 참조가 반환됩니다. 사본을 반환하는 속성을 사용하는 것은 개발자에게 매우 혼란 스러울 수 있으며이 특성은 종종 문서화되지 않습니다.
3
th1rdey3

Java에 대한 대부분의 IDE는 원하는 경우 자동으로 getter 및 setter 코드를 생성합니다. 여러 가지 규칙이 있으며 Eclipse와 같은 IDE 어떤 것을 사용하고 싶은지 선택할 수 있으며 자신 만의 것을 정의 할 수도 있습니다.

Eclipse에는 자동 리팩토링 기능이 포함되어있어 getter 및 setter에서 속성을 마무리하고 속성에 직접 액세스하는 모든 코드를 수정하여 getter 및/또는 setter를 사용할 수 있습니다.

물론 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

문서는 지금 약간 가벼우 나, 빠른 참조는 아이디어를 이해해야합니다.

기본적으로 getter/setter (및 기타 여러 코드 생성 옵션)로 수퍼 클래스를 생성합니다.

샘플 클래스는 다음과 같습니다.

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

사용 가능한 샘플이 더 많으며 생성 된 코드에 런타임 종속성이 없습니다.

당신이 그것을 시도하고 유용 발견하면 나에게 이메일을 보내! -스캇

1
Scott Stanchfield

Eclipse를 사용하는 경우 내부 속성에 대한 getter 및 setter 메소드를 자동으로 생성하는 기능이 있으며 유용하고 시간을 절약하는 도구가 될 수 있습니다.

1
TK.

Java (C #에서 찾을 수있는 것처럼)에는 속성 키워드가 없습니다. C++에서 1 Word getter/setter를 사용하는 가장 가까운 방법은 다음과 같습니다.

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