2012-12-14 4 views
2

내가 자바에 새로운 오전의 방법을 얻을 수 (정확히 1 년!)사용 설정/인터페이스

내 질문은 내가 인터페이스의 메소드와 정적 필드를 얻고 다른 클래스에서 구현 설정/쓰기 할 수있는 방법입니다.

내 코드는 다음과 같다 : (짧은!)

public interface myInterface{ 
int number=0; 

public int setNumber(int num);{ 

} 
} 

// my class 

public void myClass extends JFrame implements myInterface{ 

... 

public int setNumber(int num){ 
    number=num;      // Error! Why? What I do? 

} 
} 

number=num에서이 오류를 가지고 있지만 그것을에서는 setName 방법에 오류가 없습니다!

+1

모든 정답 외에 setNumber 메서드는 현재 int 값을 반환해야합니다. 그렇지 않으면 컴파일되지 않습니다. – Averroes

+0

가능한 [Java 인터페이스 사용 지침 - 인터페이스의 getter 및 setter가 잘못 되었습니까?] (http://stackoverflow.com/questions/1130294/java-interface-usage-guidelines-are-getters-and-setters- in-an-interface-bad) – demongolem

답변

14

당신은 그들이 일정 (인스턴스 필드 인터페이스에서를 정의 할 수 없습니다 - static final -. 값, 감사 Jon에, 그들은 단지 따라서 구현의 일부에 있기 때문에, 단지 getter 및 setter는에 인터페이스는 필드 구현에서 제공하는 반면.

그리고 setNumbervoid 대신 int의 반환해야합니다. 점점 들어 나는 당신이 int getNumber()를 추가하는 것이 좋습니다.

public interface MyInterface { 
    void setNumber(int num); // public is implicit in interfaces 
    int getNumber();   // obviously 
} 

public class MyClass implements MyInterface { 
    private int number = 0; 

    public void setNumber(int num) { this.number = num; } 
    public int getNumber() { return this.number; } 
} 

보시다시피, setNumberMyInterface의 일부입니다. 소비자는 번호 저장 방법을 알 필요가 없으므로 구현 세부 사항입니다.

게다가 Java에서는 camelCase이 아닌 PascalCase에 클래스와 인터페이스의 이름을 지정합니다.

+9

또는 인터페이스에서 선언 할 수있는 유일한 필드는 상수입니다. –

+1

'인터페이스'에 실제로 세터를 넣고 싶다면 두 번 생각해야합니다. 당신이 구현을 모른다는 것을 감안할 때, 당신은 아마도 그것들을 필요로하지 않는 더미 (dummy) 또는 상수 (constant) 구현체 (setter)를 갖도록 강요한다면 너무 많이 말하고있을 것이다. – mgarciaisaia

+0

동의합니다. 그러나, OP는 이미 "외로운"세터를 가지고 있었는데, 나는 그것이 게터보다 덜 일반적이라고 생각합니다. 그래서 두 가지를 모두 추가했습니다. –

3

인터페이스는 메서드 본문 정의를 포함 할 수 없으며 필드는 보통 상수 선언에 사용되는 public, finalstatic입니다. 이 인터페이스를 구현하려는 위치가 정의됩니다.

Java 프로그래밍 언어에서 인터페이스는 상수, 메서드 시그니처 및 중첩 형식 만 포함 할 수있는 클래스와 비슷한 참조 유형입니다. 메서드 본문이 없습니다. 인터페이스는 인스턴스화 될 수 없으며 클래스로만 구현되거나 다른 인터페이스로 확장 될 수 있습니다.

그러나 abstract class

ref

구체적인 방법뿐만 아니라 추상 메소드를 포함 할 수 있습니다.

4

deafulat public static final에 의해 인터페이스에서 선언 된 필드를 변경할 수 없습니다.

final이 표시되므로 초기화 후에는 변경할 수 없습니다.

그리고 인터페이스에서 코드에서 수행하는 것처럼 메소드 구현을 제공 할 수 없습니다.

그냥 메소드 서명 후 ;을 넣어 {}하지 (심지어 비어 있지 {}) :

public int setNumber(int num); 
8

당신이 인터페이스에 값을 정의 할 때 암시 public static final 즉 불변의 아닌 인스턴스 필드입니다.

인터페이스는 동작을 정의하는 것이 아니라 계약을 정의하는 데 사용되므로 모든 구현에이 필드가 있음을 주장하는 것이 타당하지 않습니다. 당신이 나 대신 interfaceinterface

3

필드뿐만 아니라 abstract class이있는 경우

BTW 당신은 ​​기본적으로있는이 작업을 수행 할 수 있습니다 공공 정적 최종 즉, 이미 interfacenumber 초기화가 constants.remember 최종 변수의 법칙을 어기는 구현 클래스에서 그 가치를 바꾸려고합니다. JLS에서

은 :

변수는 최종 선언 할 수 있습니다. 최종 변수는 일 경우에만 할당 될 수 있습니다. 변수 final을 선언하면 유용한 값인 설명서가 제공되므로 값이 변경되지 않으므로 프로그래밍 오류 을 피할 수 있습니다.

할당 전에 할당되지 않은 코드 (§16)가 최종 변수에 할당되면 컴파일시 오류가 발생합니다.

또한 인터페이스의 메소드는 기본적으로 public abstract입니다. 나는 당신의 인터페이스에서 당신의 서명 서명을 이해하지 못한다. 그것은 아래처럼되어야합니다.

public void method();