2014-05-25 8 views
0

할당을 위해 AES를 구현 중이고 키가 항상 길이가 정확히 16, 24 또는 32 인 바이트 배열인지 확인하는 논리를 캡슐화하려고합니다.바이트 배열을 확장 할 수 있습니까?

저장할 수있는 래퍼 클래스를 만들 수 있습니다 byte [] 내부적으로 바이트하지만 Array 나 비슷한 것을 확장 할 수 있다면 Iterators, toString 및 자바 배열을 사용하여 얻을 수있는 다른 편리한 메서드를 다시 구현할 필요가 없는지 궁금합니다.

e.e. 다음과 같은 것이 가능한가?

public class Key extends Array<Byte>{ 

    // Valid length of key in bytes 
    public static int[] possibleLengths = new int[]{ 16, 24, 32 }; 

    // Check if a given byte[] is a valid candidate for a key 
    public static boolean isValidLength(byte[] input) { 
     for (int length: possibleLengths) { 
      if (input.length == length) return true; 
     } 
     return false; 
    } 

    // Primary constructor passes bytes directly to internal state 
    public Key(byte[] input) throws InvalidKeyLengthException { 
     if (!isValidLength(input)) 
      throw new InvalidKeyLengthException; 

     setKey(input); 
    } 
} 
+2

'Key' 클래스의 필드가 바이트 배열에 더 적합 할 것 같습니다. – chrylis

+0

@chrylis 그것이 내가 처음 구현 한 방법이었고, 내가 바퀴를 다시 발명하는지 확인하고 싶었습니다. 의견을 보내 주셔서 감사합니다. –

답변

2

아니요, 아니요, 배열 클래스를 확장 할 수 없습니다.

그러나 ArrayList를 확장 할 수 있다고 생각합니다. 그렇기 때문에 원하는만큼 가까이 다가 갈 수 있습니다. 그러나 임의로 용량을 확장 할 수있는 ArrayList의 기능을 비활성화해야합니다.

그런데이 경우에는 "상속을 통한 집계 우선"지침을 따라야하고 배열 또는 ArrayList를 클래스의 필드로 지정해야합니다.

1

배열은 이상한 개념입니다. 그들은 클래스가 아니지만 길이와 같은 몇 가지 속성을 가지고 있으므로 시도하는 것처럼 확장 할 수 없습니다.

당신은 ArrayList로 변환 할 수 있습니다

new ArrayList<Byte>(Arrays.asList(Key)) 

그래서, 당신은 ArrayList를 확장하는 클래스를 작성하고 새 functionalists을 추가 할 수 있습니다. 그런 다음 위와 같이 ByteArray을 사용자 정의 클래스로 변환하고 새로 확장 된 메소드로 요구 사항을 자유롭게 확인하십시오!

2

음 ... 아니요. 배열 인스턴스화시 it's dynamically generated이므로 배열 유형을 확장 할 수 없습니다.

래퍼 클래스의 필드 (즉, Key)로 사용하는 것이 훨씬 더 합리적입니다.

도우미 메서드 등을 사용하는 데 신경 쓰면 간단히 중요한 책임을 위임 할 수 있습니다. 즉 배열을 노출하고 의미가있는 toString()을 노출 할 수 있습니다.

관련 문제