JavaRush /Java блогу /Random-KY /Котлин менен Java ортосунда кандайдыр бир айырма барбы?
Paul Soia
Деңгээл
Kiyv

Котлин менен Java ортосунда кандайдыр бир айырма барбы?

Группада жарыяланган
Баарына салам. Мен үйрөнчүктөр үчүн пайдалуу боло турган Котлин тor жөнүндө бир нече негизги нерселерди айткым келет. Ошентип, азыр бир гана тил менен Android иштеп чыгууга кирүү кыйын болуп калат - көпчүлүк жаңы долбоорлор Котлинде жазыла баштайт, даяр долбоорлордун көбү Java тorнде жазылат. Котлин менен Java ортосунда кандайдыр бир айырма барбы?  - 1Учурда менде 4 долбоор бар: экөө Котлинде жана экөө Javaда (бир чоң негизги жана үч кичинекей ички колдонуу үчүн). Компания Котлинде жаңы долбоорлорду жазууну чечкенде, бул чечим мага кызыктай көрүндү. Эмне үчүн ар кандай тилдерди аралаштырып? Котлинге башка бирөө жазсын, бул бизге эмне үчүн керек? Бирок айла жок болгондуктан, мен жаңы тилди сынап көрүүнү чечип, аны үйрөнө баштадым. Биринчи code, албетте, толугу менен Java стorнде жазылган, бул дагы түшүнбөстүктү күчөттү: эмне үчүн мага жаңы тил керек? Бирок мен аны колдонгон сайын мен көбүрөөк артыкчылыктарды таптым жана азыр (мен Котлинде дээрлик 2 жылдан бери жазып жатам) Котлин Android иштеп чыгууда ыңгайлуу деп айта алам. Мен Javaдан кийин Котлинди үйрөнүүнү чечкен адам үчүн ачык-айкын болбой турган кээ бир нюанстарды көрсөткүм келет. Эске сала кетейин, Android Java 8ди колдонот, учурдагы versionсы 14. Ошентип, биринчиден - Variables : Java:
Int a = 1;
String s = "test";
Котлин:
val a = 1
var b = 2
val c: Int
val d = "test"
Котлинде өзгөрмөлөрдүн эки түрү бар: val (окуу үчүн гана) жана var (окуу-жазуу). Мүмкүн болушунча val колдонуу сунушталат. Эгерде өзгөрмө инициализацияланган болсо, өзгөрмөнүн түрүн жарыялоонун кереги жок. Экинчиси - if/else, которуштуруу операторлору : Java'да бул чынжырчаны канчалык көп колдоносуз:
if (вариант 1)
{...}
else if (вариант 2)
{...}
...
else
{...}
Же бул сыяктуу:
switch(выражениеДляВыбора) {
        case (meaning 1):
                Код1;
                break;
        case (meaning 2):
                Код2;
                break;
...
        case (meaning N):
                КодN;
                break;
        default:
                КодВыбораПоУмолчанию;
                break;
        }
Котлинде, мындай туюнтмалар үчүн качан оператору колдонулат (бирок if/else да колдонулушу мүмкүн):
val x = 5
val result = when(x) {
        0, 1 -> "cool"
        2 -> "bad"
        5 -> "normal"
        else -> "error"
}
System.out.println(result)
Бул жерде биз шарттардын тизмегинен өтүп гана тим болбостон, дароо эле бүтүндөй туюнтманы жыйынтык өзгөрмөсүнө дайындадык, бул бизге бир нече code саптарын сактап калды. Бирок ошентсе да, бутакта эки гана вариантыңыз болсо, мен кадимки if..else колдонууну сунуштайм. Качан курулуш үч варианттан гана кыска болот. Келгиле, уланталы - Конструкторлор . Бул жерде жомок. Жөн гана Java жана Котлиндеги codeду салыштырыңыз. Java:
public class Person {

    private String firstName;
    private String lastName;
    private int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
Котлин:
class Person(private val firstName: String,
             private val lastName: String,
             private var age: Int) {
}
Котлин codeунда бир нерсе бүтпөй калгандай сезorши мүмкүн. Бирок, жок, бул ар башка тилдердеги эки бирдей code. Келгиле, бир аз түшүнүп көрөлү. Котлинде конструктор класстын аталышынын негизги бөлүгүнө түз жазылышы мүмкүн (бирок эгер кааласаңыз, аны Javaдагыдай эски модада жасай аласыз). Ошентип, биз үч өзгөрмө жаздык, Javaда биз курактык өзгөрмө үчүн конструктор, гетер жана бир орнотуучуну түздүк. Котлинде, эсибизде тургандай, val өзгөрмөсү окуу үчүн гана, ошондуктан бул өзгөрмөлөр үчүн орнотуучу жеткorктүү эмес (Котлин капоттун астында Getter-setterлерди ишке ашырат). Var өзгөрмө сиз орнотуучуну колдонууга мүмкүндүк берет. Натыйжада, биз Java тorнде ондон ашык саптарды алган нерсени дээрлик бир сапка жаздык. Бул жерде мен Котлиндеги маалымат класстары жөнүндө көбүрөөк окууну сунуштайм. Бирок бул Котлин конструкторлорунун жакшы билген нерселери эмес. Бирок сизге эки конструктор керек болсочы? Үч болсочу? Javaда бул мындай болот:
public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

public Person(String firstName) {
        this.firstName = firstName;
    }
Татаал эч нерсе жок, керек болсо көп дизайнерлер, алар эмне кылышты. Котлинде сиз бир эле конструктор менен иштей аласыз. Кантип? Бул жөнөкөй - демейки маанилер.
class Person(private val firstName: String,
             private val lastName: String? = null,
             private var age: Int = 5) {
}
Биз конструктордо демейки маанилерди ыйгардык жана азыр аларды чакыруу төмөнкүдөй болот:
Person(firstName = "Elon", lastName = "Mask", age = 45)
Person(firstName = "Elon", age = 45)
Person(firstName = "Elon", lastName = "Mask")
Суроо туулат: бул эмне:
private val lastName: String? = null
Бул башка суроо белгилери кандай? Ооба, эгер маани нөл болушу мүмкүн болсо, анда ал орнотулат.Мындай ?вариант дагы бар - !!(эгер өзгөрмө нөлдү кабыл албаса). Бул тууралуу өзүңүз окуңуз, баары жөнөкөй. Жана биз кийинки пунктка өтөбүз. Кеңейтүүлөр . Бул Javaда жок Котлиндеги абдан сонун курал. Кээде долбоордо биз көп класстарда кайталануучу шаблон ыкмаларын колдонобуз. Мисалы, бул сыяктуу:
Toast.makeText(this, "hello world :)", Toast.LENGTH_SHORT).show();
Котлинде биз классты кеңейте алабыз:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
Анан аны бүткүл долбоордо мындайча колдонуңуз:
context?.toast("hello world")
Контекст классы үчүн кеңейтүүнү жасадык. Эми контекст кайда болбосун, анын жаңы тост ыкмасы жеткorктүү болот. Бул каалаган класс үчүн жасалышы мүмкүн: String, Fragment, сиздин жеке класстарыңыз, эч кандай чектөөлөр жок. Жана биз карап чыга турган акыркы пункт - Саптар менен иштөө . Бул жерде баары жөнөкөй. Java тorнде мындай деп жазылган:
String s = "friends";
int a = 5;
System.out.println("I have" + a + s + "!");
Котлинде бул жеңorрээк:
val s = "friends"
val a = 5
println("I have $a $s!")
Бул Котлинди үйрөнүүнүн башында мен байкаган нюанстар, бул сизге жардам берет деп үмүттөнөм.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION