2014-11-20 4 views
0

Я пытаюсь понять несколько конструктора цепочки, я знаю, что вызов конструктора из другого конструктора того же класса известен как Конструктора цепочки,Путаница с Constructor цепочки

Когда мы используем это внутри строителю, мы на самом деле вызов другой конструктор, который мы уже определили, но программа, которую я пытаюсь понять, это странно,

public AESCipher(Key key) { 
     this(key.getEncoded()); 
    } 

    /** 
    * Create AESCipher based on existing {@link Key} and Initial Vector (iv) in bytes 
    * 
    * @param key Key 
    */ 
    public AESCipher(Key key, byte[] iv) { 
     this(key.getEncoded(), iv); 
    } 

    /** 
    * <p>Create AESCipher using a byte[] array as a key</p> 
    * <p/> 
    * <p><strong>NOTE:</strong> Uses an Initial Vector of 16 0x0 bytes. This should not be used to create strong security.</p> 
    * 
    * @param key Key 
    */ 
    public AESCipher(byte[] key) { 
     this(key, INITIAL_IV); 
    } 

    private AESCipher(byte[] key, byte[] iv) { 
     try { 
      this.secretKeySpec = new SecretKeySpec(key, "AES"); 
      this.iv = new IvParameterSpec(iv); 
      this.cipher = Cipher.getInstance(ALGORITHM_AES256); 
     } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { 
      throw Throwables.propagate(e); 
     } 
    } 

в первом конструкторе, эта строка используется this(key.getEncoded()), что конструктор этой линии звонит? перед ним нет конструктора, на самом деле нет конструктора с одним параметром.

и в 3-конструктор, есть только один аргумент типа byte[], и это то, что происходит внутри,

this(key, INITIAL_IV); 

это цепочки конструктор с двумя параметрами, один из типа key и из из type byte[], поэтому он связывает этот конструктор AESCipher(Key key, byte[] iv), это прекрасно, но все же ... что происходит в первом конструкторе и почему существует необходимость в 4 конструкторах на первом месте.

P.S: Я просто не публиковал этот вопрос, я провел как 4 часа, пытаясь понять, что происходит, но слишком запутанно.

Вот полный код,

https://github.com/mike-ensor/aes-256-encryption-utility/blob/master/src/main/java/com/acquitygroup/encryption/AESCipher.java

+0

[Key # getEncoded()] (https://docs.oracle.com/javase/7/docs/api/java/security/Key.html#getEncoded%28%29). 'на самом деле нет конструктора с одним параметром.' Конечно? Я вижу два конструктора с одним аргументом. – Tom

+0

Я угадываю 'Key # getencoded()' возвращает 'byte []'. Итак, 'this (key.getencoded())' вызывает третий конструктор в коде, который вы показываете. –

ответ

5

Первый конструктор звонит третий конструктор: public AESCipher(byte[] key).

Насколько почему 4 Конструкторы в первую очередь, он предназначен для инкапсуляции логики, которая имеет дело с поворотом Key в byte[], и позволить пользователю использовать другой начальный вектор, если они пожелают.

+2

- спот сверху. Кроме того, я заметил это: 'перед ним нет конструктора ... '. Если этим вы под впечатлением, что вы не можете вызывать методы, находящиеся далее в файле; ничто не может быть дальше от истины. Java не заботится о том, чтобы в нем отображались методы или другие биты (по большей части ... статические правила инициализации действительно заботятся, но это не проблема). –

Смежные вопросы