Я пытаюсь понять несколько конструктора цепочки, я знаю, что вызов конструктора из другого конструктора того же класса известен как Конструктора цепочки,Путаница с 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 часа, пытаясь понять, что происходит, но слишком запутанно.
Вот полный код,
[Key # getEncoded()] (https://docs.oracle.com/javase/7/docs/api/java/security/Key.html#getEncoded%28%29). 'на самом деле нет конструктора с одним параметром.' Конечно? Я вижу два конструктора с одним аргументом. – Tom
Я угадываю 'Key # getencoded()' возвращает 'byte []'. Итак, 'this (key.getencoded())' вызывает третий конструктор в коде, который вы показываете. –