문제

그래서 나는 최근까지 Java n00b를 의도적으로 유지해 왔으며 처음으로 실제로 노출된 것은 약간의 충격을 받았습니다.Java에는 C# 스타일 속성이 없습니다!

좋아, 난 그걸로 살 수 있습니다.그러나 하나의 코드베이스에서 Java의 속성 getter/setter 코드를 본 적이 있지만 어디에 있는지 기억이 나지 않습니다.그것은 어떻게 달성되었나요?이에 대한 언어 확장이 있습니까?NetBeans 등과 관련이 있습니까?

도움이 되었습니까?

해결책

Java에는 getter 및 setter에 대한 "표준" 패턴이 있습니다. 콩의 속성.기본적으로 다음으로 시작하는 모든 방법 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;

이 코드는 생성됩니다 getAwesomeInteger 그리고 setAwesomeInteger 또한.그래서 그것은 다음과 매우 유사합니다. C# 자동 구현 속성.

Lombok getter 및 setter에 대한 자세한 정보를 얻을 수 있습니다. 여기.
꼭 확인해보세요 다른 기능들 또한.내가 가장 좋아하는 것은 다음과 같습니다.

Lombok은 IDE와 잘 통합되어 있으므로 생성된 메서드가 존재하는 것처럼 표시됩니다(제안, 클래스 콘텐츠, 선언으로 이동 및 리팩토링).
lombok의 유일한 문제점은 다른 프로그래머가 이에 대해 알지 못할 수도 있다는 것입니다.당신은 항상 할 수 있습니다 델롬복 코드는 솔루션이라기보다는 해결 방법입니다.

"Java 속성 지원"은 Java 7에 대해 제안되었지만 언어에는 적용되지 않았습니다.

보다 http://tech.puredanger.com/java7#property 관심이 있다면 더 많은 링크와 정보를 확인하세요.

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/

속성처럼 보이도록 하려면 "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());
    }
}

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

Eclipse에는 속성을 getter 및 setter로 래핑할 수 있는 자동화된 리팩토링도 포함되어 있으며 속성에 직접 액세스하는 모든 코드를 수정하여 getter 및/또는 setter를 사용하도록 합니다.

물론 Eclipse는 자신이 알고 있는 코드만 수정할 수 있습니다. 이러한 리팩토링으로 인해 외부 종속성이 손상될 수 있습니다.

에서 제프리 리히터의C#을 통한 CLR:(이것이 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를 사용하는 경우 내부 속성에 대한 getter 및 setter 메소드를 자동 생성하는 기능이 있으므로 유용하고 시간을 절약할 수 있는 도구가 될 수 있습니다.

저는 이를 돕기 위해 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 {
}

더 많은 샘플을 사용할 수 있으며 생성된 코드에는 런타임 종속성이 없습니다.

시험해보고 유용하다고 생각되면 이메일을 보내주세요!-- 스캇

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

이전에 Eclipse에 대해 언급한 것처럼 통합 개발 환경(IDE)은 자동으로 접근자 메서드를 생성할 수 있는 경우가 많습니다.

NetBeans를 사용하여 이를 수행할 수도 있습니다.

클래스에 대한 접근자 메서드를 생성하려면 클래스 파일을 연 다음 소스 코드 편집기의 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 메뉴 명령 리팩터링, 필드 캡슐화를 선택합니다.대화 상자가 열립니다.모두 선택을 클릭한 다음 리팩터링을 클릭합니다.짜잔,

행운을 빌어요,

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top