2011-10-27 5 views
2

내가하고 싶은 일이 가능한지 알아 내려고하고 있습니다. 나는 주위를 둘러 보았다. 구글은 적어도이 특별한 경우에 도움이되지 않았다.익명 클래스의 메서드 사용

다음은 내가하려는 일입니다. 내가 맡고있는 과제는 두 가지 가능한 인수 집합 [ "CREATE" "cardType"] 또는 [ "VERIFICATION" "accountNumber" "transactionAmout"]을 사용하여 명령 줄에서 여러 번 실행되도록 설계되었습니다. "CREATE"플래그가 전달 될 때마다 클래스의 익명 인스턴스가 생성됩니다. 생성자는 클래스와 관련된 다양한 데이터 필드를 만들고이를 파일에 기록하고 프로그램을 종료합니다. 좋아, 지금까지. 여기 생성자에서 조각입니다 (이 이러한 여러하지만 그들은 모두 거의 동일한 것) :

if(issuer.compareTo("AE") == 0) 
    { 
     try 
     { 
     cardType = "American Express"; 
     firstDigit = 3; 
     accountNumber = accountNumberGen(firstDigit);    
     memberSince = new java.util.Date(); 
     limit = setLimit(accountNumber); 
     output.write(accountNumber + "|" + cardType + "|" + 
       memberSince + "|" + limit + "\r\n"); 
     } 
     catch(Exception e) 
     { 
      System.out.printf("An unexpected error occured. Sorry.\n" 
        + "American Express Constructor."); 
      System.exit(0); 

     } 

그래서, 여기에 내가 알아 내기 위해 노력하고있어입니다. 다음 단계는 "VERIFICATION"플래그입니다. 확인 플래그가 명령 줄에서 전달되면 파일에 들어가서 저장된 데이터를 읽고 변경 한 다음 다시 파일에 기록해야합니다. 다시 말하지만, 지금까지는 괜찮습니다. 여기에 문제가 있습니다 :

클래스의 인스턴스가 없으므로 클래스의 메서드를 호출 할 수 없습니다. 그러나 Verification 메서드는 명령 줄 인수를 완전히 처리하고 파일을 읽고 쓰는 등의 작업을 수행하기 위해 클래스의 인스턴스가 필요하지 않습니다. 그렇다면 클래스 내에서 익명으로 메소드를 호출하는 방법은 무엇입니까? 다른 인증 클래스를 만들어야합니까, 아니면 메소드를 기본 클래스로 옮길 수 있습니까? 과제 중 하나는 생성과 검증을 처리하는 클래스가 있어야한다는 것을 암시하기 때문에 어느 쪽인가에 대해서는 조금 주저합니다. 아니면, 또 다른 가능성은, 내 논리는이 결함에 접근하는 것이 결함인가?

이 코드는 진행중인 작품입니다 - 예외는보다 구체적인 될 것이다 열려있는 모든 filestreams은 폐쇄하려고하는 등

+1

무엇 생성자가없는 클래스 존재하지 않는 경우에서 조각? 실제 오브젝트 구조에 관한 세부 사항이 필요하다고 생각합니다. 또한, 이들 중 어느 것에 대해 얼마나 많은 통제력을 가지고 있습니까? 많은 구현 클래스 (또는 추상 수퍼 클래스)가있는 인터페이스를 사용해야하는 것 같습니다. – Thor84no

+0

가 여기에 익명으로 무엇을 의미하는지, 난 '공공 정적 무효 메인 (문자열 []에 args)이 예외 { inputValidation (인수)를 던졌습니다 ... 잘못된 용어를 사용했을 수 있습니다; (args.length == 2) 새 계정 (args [1]) } ' – MikeTheLiar

답변

2

내가 질문/과제를 제대로 이해했다면 (그리고 내가 할 수 있는지 잘 모르겠지만, 과제의 요구 사항은 정확히 무엇입니까? 익명의 수업을 사용해야합니까?) 익명의 방법과 같은 것은 없습니다. 자바, 익명 클래스 만.), 일회용 Vertification 클래스 또는 정적 메서드가 필요할 수도 있습니다.

일회성있어서

Verification v = new Verification(commandLineArgs); 
v.verify(); 
// Done with 'v' 

정적 방법 ..방법 :이 방법은 같은 클래스에 정의되어

Verification.verify(commandLineArgs); 

:

public class Verification { 
    ... 
    public static void verify(String ... commandLineArgs) { 

    } 
    ... 
} 
+0

이 소리는 유망하다. 나는 이것이 이것이 갈 길이라고 생각한다. – MikeTheLiar

+0

업데이트 ....이 일이있어, 고마워. 그래도 여전히 익명의 전화를 사용하고 있기 때문에 또 다른 질문이 있습니다. 새 계정 (args [1]); 새로운 검증 (args [1], args [2]); 선언 된 후에 사용하지 않아도 이름을 더 잘 지정 하시겠습니까? 수업 자체는 끝내야 할 모든 것을하고 있습니다 (쓰기, 읽기, 처리 등). 아니면 수업이 제대로 설계되지 않았습니까? – MikeTheLiar

+0

당신이하고있는 모든 일이 생성자를 호출하는 것이라면, 클래스가 제대로 설계되지 않은 것입니다. 생성자 코드를 정적 메서드로 가져와야합니다. (내가 제안한 두 번째 방법입니다.) 생성자는 인스턴스 변수 초기화와 그 객체를 사용하기 위해 ** 필요한 ** 다른 종류의 설치에만 사용해야합니다. 그러나 추가 실행은 일반적으로 싫은 일입니다. –

3

한 약어 : KISS :

예, 모든 종류의 할 수 마술, 리플렉션을 통한 메서드 호출 등. 그러나 왜 귀찮은가?

첫 번째 인수를 취하여 CreateHandler 또는 VerificationHandler을 만드는 주 방법을 만듭니다.

void run(String[] args); 

그래서 스위치 후에는 상관없이 그것이 어느, handler.run(args)으로 새로운 핸들러를 호출 할 수 있습니다 : 모두이 방법을 가지고 Handler 인터페이스를 구현합니다.

그런 다음 처리기는 명령 줄을 검사하여 사용자가 원하는 것을 찾습니다.

로딩/저장과 같은 일반적인 코드를 도우미 클래스로 옮깁니다. 방법을 짧게 유지하십시오 (5-15 줄). 각 방법은 한 가지를해야합니다. 복잡한 작업을 도우미 메서드로 옮깁니다.

+0

동의합니다. 두 개의 Create/Verification 클래스 사이의 공용 인터페이스가 상당히 도움이됩니다. –

+0

이 사운드는 매우 유용 할 것입니다.하지만 제 지식이 부족한 머리카락 일 수 있다고 생각합니다. 마감 시간에 맞춰 작업하는 것이 새로운 것을 시도하기에 가장 좋은 장소는 아닙니다. 팁 (팁)에 감사드립니다. – MikeTheLiar

+0

반성/연구에 따라, 내가 시작했을 때 핸들러에 대한 지식이 없으면 달성하려는 노력이 어느 정도라고 생각합니다. 본질적으로 (핸들러를 올바르게 이해하고 있다면) 클래스를 핸들러로 변환했습니다. 다시 한 번 감사드립니다. 귀하의 제안은 정말 도움이되었습니다. 사용하지 않더라도 앞으로는 분명히 도움이 될 것입니다. – MikeTheLiar