Sou novo no Kotlin e recentemente converti um arquivo simples de java para Kotlin. Estou me perguntando por que o conversor do Android mudou minha classe java para um objeto Kotlin.
Java:
public class MyClass {
static public int GenerateChecksumCrc16(byte bytes[]) {
int crc = 0xFFFF;
int temp;
int crc_byte;
for (byte aByte : bytes) {
crc_byte = aByte;
for (int bit_index = 0; bit_index < 8; bit_index++) {
temp = ((crc >> 15)) ^ ((crc_byte >> 7));
crc <<= 1;
crc &= 0xFFFF;
if (temp > 0) {
crc ^= 0x1021;
crc &= 0xFFFF;
}
crc_byte <<= 1;
crc_byte &= 0xFF;
}
}
return crc;
}
}
Kotlin convertido:
object MyClass {
fun GenerateChecksumCrc16(bytes: ByteArray): Int {
var crc = 0xFFFF
var temp: Int
var crc_byte: Int
for (aByte in bytes) {
crc_byte = aByte.toInt()
for (bit_index in 0..7) {
temp = crc shr 15 xor (crc_byte shr 7)
crc = crc shl 1
crc = crc and 0xFFFF
if (temp > 0) {
crc = crc xor 0x1021
crc = crc and 0xFFFF
}
crc_byte = crc_byte shl 1
crc_byte = crc_byte and 0xFF
}
}
return crc
}
}
Por que não foi:
class MyClass {
... etc ...
}
Qualquer ajuda seria muito apreciada, obrigado.
Um objeto é um singleton. Você não precisa criar uma instância para usá-lo.
Uma classe precisa ser instanciada para ser usada
Da mesma forma que em Java você pode dizer Math.sqrt (2) e não precisa criar uma instância do Math para usar sqrt, em Kotlin você pode criar um objeto para conter esses métodos, e eles são efetivamente estáticos.
Há algumas informações aqui:
https://kotlinlang.org/docs/reference/object-declarations.html
O IntelliJ obviamente foi inteligente o suficiente para detectar que você precisa de um objeto, já que você só tem métodos java estáticos.
fonte
Human
tiver um campo int estáticoPopulation
, como isso seria no Kotlin?companion object { @JvmField val Population; }
ou alguma coisa?Além disso, você pode definir funções sem declaração de objeto. Apenas no arquivo .kt Por exemplo:
E esta função estava relacionada ao pacote onde o arquivo .kt é declarado. Você pode ler mais sobre isso aqui https://kotlinlang.org/docs/reference/packages.html
fonte
Com base na resposta de @ speirce7:
O código a seguir mostra a diferença básica entre uma classe e um objeto quando se trata de Kotlin:
fonte