2010-05-01 3 views
1

큰 클래스에는 Format-interfcase 및 Format-class가 포함됩니다. Format-class에는 메서드가 포함되어 있고 인터페이스에는 필드 값이 있습니다. 형식 필드에 필드를 가질 수 있지만 목표는 인터페이스입니다. 그렇다면 오류를 없애기 위해 더미 바를 만드는 것인가 아니면 디자인 문제인가 아니면 다른 무엇인가? Java : 인터페이스에서 선언이 충분하지 않은 이유는 무엇입니까?

KEY

: 선언 VS 초기화

  1. 는 인터페이스 초기화하기 위해서 왜 조건에 의해 설명한다.
  2. 뒤에있는 논리는 무엇입니까?
  3. 인터페이스의 사용으로 인해 어떤 문제가 발생합니까?

샘플 코드 인터페이스의 초기화 - 인터페이스 문제

import java.util.*; 
import java.io.*; 

public class FormatBig 
{ 

     private static class Format implements Format 
     { 
       private static long getSize(File f){return f.length();} 
       private static long getTime(File f){return f.lastModified();} 
       private static boolean isFile(File f){if(f.isFile()){return true;}} 
       private static boolean isBinary(File f){return Match.isBinary(f);} 
       private static char getType(File f){return Match.getTypes(f);} 
       private static String getPath(File f){return getNoErrPath(f);} 
       //Java API: isHidden, --- SYSTEM DEPENDED: toURI, toURL 


       Format(File f) 
       { 
        // PUZZLE 0: would Stack<Object> be easier? 
         size=getSize(f); 
         time=getTime(f); 
         isfile=isFile(f); 
         isBinary=isBinary(f); 
         type=getType(f); 
         path=getPath(f); 

        //PUZZLE 1: how can simplify the assignment? 
         values.push(size); 
         values.push(time); 
         values.push(isfile); 
         values.push(isBinary); 
         values.push(type); 
         values.push(path); 
       } 
     } 

     public static String getNoErrPath(File f) 
     { 
       try{return f.getCanonicalPath(); 
       }catch(Exception e){e.printStackTrace();} 
     } 

     public static final interface Format 
     { 
       //ERR: IT REQUIRES "=" 
       public long size; 
       public long time; 
       public boolean isFile=true; //ERROR goes away if I initialise wit DUMMY 
       public boolean isBinary; 
       public char type; 
       public String path; 
       Stack<Object> values=new Stack<Object>(); 
     } 

     public static void main(String[] args) 
     { 
       Format fm=new Format(new File(".")); 
       for(Object o:values){System.out.println(o);} 
     } 
} 

답변

3

@Tom 님이 귀하의 직접적인 질문에 답변했습니다. 기본적으로 인터페이스에서 인스턴스 수준 속성 (또는 클래스 수준 변수)을 선언 할 수 없습니다. 인스턴스 레벨 속성은 클래스에서 선언되어야합니다.

여러 클래스가 동일한 속성 선언을 공유하도록하려면 이 될 수 있습니다.이를 추상 수퍼 클래스에 넣을 수 있습니다. 그러나 가장 좋은 방법은 속성을 private으로 선언하고 getters 및 setter를 통해 액세스하는 것입니다. 당신은 클래스와 같은 네임 스페이스에 같은 이름을 가진 인터페이스를 선언 할 수 없습니다

  • :

    은 코드 다른 문제의 몇 가지가 있습니다. Format 클래스는 Format이라는 인터페이스를 구현하며 둘 다 FormatBig의 네임 스페이스에 선언되었습니다. 가능한 경우 (예 : 서로 다른 네임 스페이스로 선언 되었기 때문에) 이는 잘못된 행동입니다. 클래스와 인터페이스에 고유 한 이름을 지정하십시오.

  • 중첩 된 클래스는 절대로 사용해야합니다. Format 클래스와 인터페이스를 FormatBig 안에 중첩시켜 하나의 파일 만 편집하고 컴파일해야하는 것처럼 보입니다. 그건 게으른거야. 또는 코드 구성을 위해 Java 패키지를 사용하는 방법을 배우십시오.

+0

[1] 문장에서 "게으른"이라는 용어의 의미를 자세히 설명 할 수 있습니까? [1] "Format 클래스를 중첩하고 FormatBig 내부를 인터페이스로 사용하여 하나의 파일 만 편집하고 컴파일해야하는 것처럼 보입니다. 게으른 것입니다. 코드를 구성하는 경우 Java 패키지 사용법을 배우십시오. " – hhh

6

필드를 가진 암시 적 public final static 있습니다.

static은 인스턴스와 독립적임을 의미합니다. 이것은 아마도 당신이 원하는 것이 아닙니다.

final은 필드가 static이기 때문에 클래스 초기화 중에 정확히 한 번만 지정해야한다는 것을 의미합니다. 이것은 일반적으로 선언에 할당하는 것을 의미하지만 static initialiser를 사용할 수 있습니다. 인스턴스 필드 (비 static) 인 경우 생성자 ("this"생성자가 아닌 super이 아닌 암시 적 또는 명시 적으로) 또는 인스턴스 초기화 프로그램에서 선언에 할당해야합니다.

인스턴스 필드를 구현 클래스로 이동하고 final으로 표시해야합니다.

관련 문제