그래서, 나는 고의적으로 자신을 Java n00b까지 최근까지 유지했으며, 첫 번째 실제 노출은 약간의 충격을 일으켰습니다. Java C # 스타일 속성이 없습니다!
좋아, 나는 그것으로 살 수있다. 그러나 한 코드베이스에서 Java의 속성 getter/setter 코드를 보았지만 어디에 있는지 기억할 수 없습니다. 어떻게 달성 되었습니까? 어떻게 언어 확장이 있습니까? NetBeans와 관련이 있습니까?
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();
아무도 언급하지 않은 것에 놀랐습니다 프로젝트 롬복
예, 현재 Java에는 속성이 없습니다. 다른 누락 된 기능도 있습니다.
운 좋게도 상황을 개선하려는 project lombok 이 있습니다. 또한 매일 점점 더 인기를 얻고 있습니다.
롬복을 사용하는 경우 :
@Getter @Setter int awesomeInteger = 5;
이 코드는 getAwesomeInteger
및 setAwesomeInteger
도 생성합니다. 따라서 C # 자동 구현 속성 과 매우 유사합니다.
롬복 게터와 세터에 대한 자세한 정보를 얻을 수 있습니다 here .
다른 기능 도 반드시 확인해야합니다. 내가 가장 좋아하는 것은 :
롬복은 IDE와 잘 통합되어 있으므로 생성 된 메서드 (제안, 클래스 내용, 선언 및 리팩토링으로 이동)와 같은 생성 된 메서드를 보여줍니다.
롬복의 유일한 문제는 다른 프로그래머가 모르는 것입니다. 항상 delombok 코드를 사용할 수 있지만 솔루션보다는 해결 방법입니다.
Java 7 "에 대해"Java 속성 지원 "이 제안되었지만 언어로 만들지 않았습니다.
관심이있는 경우 더 많은 링크 및 정보는 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
및 필요한 경우 재정의 할 수있는 기본 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());
}
}
Jeffrey Richter 's book C #을 통한 CLR : (이것이 Java에서 속성이 여전히 추가되지 않는 이유 일 수 있습니다)
out
또는 ref
매개 변수로 메서드에 전달할 수 없습니다. 필드 캔.System.MarshalByRefObject
), 속성 메소드 호출은 매우 느리므로, 메소드가 메소드보다 선호됩니다. 제 생각에는 MarshalByRefObject
에서 파생 된 클래스는 속성을 사용해서는 안됩니다.System.DateTime
클래스에는 현재 날짜와 시간을 반환하는 읽기 전용 Now
속성이 있습니다. 이 속성을 쿼리 할 때마다 다른 값이 반환됩니다. 이것은 실수이며 Microsoft는 Now 대신 속성 대신 메서드를 만들어 클래스를 수정할 수 있기를 바랍니다. Environment
의 TickCount
속성이이 실수의 또 다른 예입니다.Java에 대한 대부분의 IDE는 원하는 경우 자동으로 getter 및 setter 코드를 생성합니다. 여러 가지 규칙이 있으며 Eclipse와 같은 IDE 어떤 것을 사용하고 싶은지 선택할 수 있으며 자신 만의 것을 정의 할 수도 있습니다.
Eclipse에는 자동 리팩토링 기능이 포함되어있어 getter 및 setter에서 속성을 마무리하고 속성에 직접 액세스하는 모든 코드를 수정하여 getter 및/또는 setter를 사용할 수 있습니다.
물론 Eclipse는 자신이 알고있는 코드 만 수정할 수 있습니다. 이러한 리팩토링으로 인해 외부 종속성이 손상 될 수 있습니다.
내 Java 경험도 그다지 높지 않으므로 누구나 자유롭게 고칠 수 있지만 AFAIK의 일반적인 규칙은 다음과 같은 두 가지 방법을 쓰는 것입니다.
public string getMyString() {
// return it here
}
public void setMyString(string myString) {
// set it here
}
나는 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 {
}
사용 가능한 샘플이 더 많으며 생성 된 코드에 런타임 종속성이 없습니다.
당신이 그것을 시도하고 유용 발견하면 나에게 이메일을 보내! -스캇
Eclipse를 사용하는 경우 내부 속성에 대한 getter 및 setter 메소드를 자동으로 생성하는 기능이 있으며 유용하고 시간을 절약하는 도구가 될 수 있습니다.
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
이전에 Eclipse에서 언급했듯이 통합 개발 환경 (IDE)은 종종 접근 자 메소드를 자동으로 작성할 수 있습니다.
NetBeans를 사용하여 수행 할 수도 있습니다.
클래스에 대한 접근 자 메서드를 만들려면 클래스 파일을 연 다음 소스 코드 편집기의 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 메뉴 명령 Refactor, Encapsulate Fields를 선택하십시오. 대화 상자가 열립니다. 모두 선택을 클릭 한 다음 리 팩터를 클릭하십시오. 보일라,
행운을 빕니다,