Pull to refresh

Вы все еще кодите на Java? Пора измениться

Reading time 6 min
Views 17K
image

Я очень долго не хотел смотреть в сторону Котлина. Но вот когда я листал список вакансий я стал все чаще замечать графу: Плюсом также будет знание Kotlin. И как-то вечерком увидел вот эту статью на хабре: 8 учебных проектов. Мне там приглянулся трекер криптовалют. Но как-то было слишком просто: обыкновенный Get-запрос, совсем не интересно. И здесь я решил попробовать написать все это на Kotlin. Трекер криптовалют стал тренировочным полигоном для изучения Котлина. После создания этой приложухи было вынесено несколько важных уроков.

Всем кому интересно прошу под кат.

Кратко обо мне


Когда я начал это все делать то у меня была масса предубеждений насчет этого языка. Что он не удобный, что он не красивый, что он плохой, и тормознутый. Это все было из-за того что я не хотел выходить из своей зоны комфорта. Я знаю Джаву она хорошая, и вообще зачем что-то менять пускай все будет как есть, зачем напрягаться. Но интерес взял свое. И могу сказать что я был очень не прав.

Что же такого особенного в Котлине чего нет в Java?

1. Отсутсвие точек с запятыми


Это бросилось в глаза с самого начала. Их отсутствие показалось просто приятным бонусом, хотя рука все равно дергалась :). Но наличие/отсутсвие такой мелочи вовсе не повод любить/ненавидеть язык (хотя когда у тебя тысячи строк кода уже вроде и не мелочь).

2. Биндинг вьюшек


Как только я закончил клепать макеты появился вопрос о том как биндить вьюхи. Я полез гуглить:«Butterknife kotlin». Вот тут-то я и поплыл. Оказалось что использовать ButterKnife в Котлине просто нет смысла. Нужно просто брать и юзать вьюшки, при этом не имея ни малейшего риска получить NPE.

Если написать код на Джаве получим это
public class MainActivity {
   private TextView textView; //1-ая строка
 
   @Override
   protected void onCreate(final Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       textView = findViewById(R.id.textView);//2-ая строка
       textView.setText("Hello world!");//3-я строка
    }
}


А теперь напишем с ButterKnife
public class MainActivity...{

   @BindView(R.id.textView)TextView textView; //1-ая строка

   @Override
   protected void onCreate(final Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      ButterKnife.bind(this);//2-ая строка
      textView.setText("Hello world!");//3-я строка
   }
}


А теперь Котлин
class MainActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView.text = "Hello world!"//1-ая и последняя строка
    }
}


3. Отсутсвие NPE


NPE — это легенда в мире программирования. И в Котлине его просто нет еще до компиляции возможные места возникновения NullPointerException считаются синтаксической ошибкой. Вас просто заставляют сделать проверку на null.

4. Код на порядок короче


По статистике код в Котлине на 40% короче, и в этом легко убедится. Для того чтобы парсить ответ нужно было сделать модели. Никогда не думал что модель со столькими полями может быть такой короткой.

Красивая и коротенькая модель в Котлине
data class ResponseItem(@SerializedName("id")
                        @Expose var id: String?, 
                        @SerializedName("name")
                        @Expose var name: String?, 
                        @SerializedName("symbol")
                        @Expose var symbol: String?, 
                        @SerializedName("rank")
                        @Expose var rank: String?, 
                        @SerializedName("price_usd")
                        @Expose var priceUsd: String?, 
                        @SerializedName("price_btc")
                        @Expose var priceBtc: String?, 
                        @SerializedName("24h_volume_usd")
                        @Expose var _24hVolumeUsd: String?, 
                        @SerializedName("market_cap_usd")
                        @Expose var marketCapUsd: String?, 
                        @SerializedName("available_supply")
                        @Expose var availableSupply: String?, 
                        @SerializedName("total_supply")
                        @Expose var totalSupply: String?, 
                        @SerializedName("max_supply")
                        @Expose var maxSupply: String?, 
                        @SerializedName("percent_change_1h")
                        @Expose var percentChange1h: String?,
                        @SerializedName("percent_change_24h")
                        @Expose var percentChange24h: String?,
                        @SerializedName("percent_change_7d")
                        @Expose var percentChange7d: String?, 
                        @SerializedName("last_updated")
                        @Expose var lastUpdated: String?) 

На самом деле код короче, потому что 2 аннотации(expose и serialized) в одну строку.

Тот же класс в Джаве. Аккуратно море кода!
@SerializedName("id")
    @Expose
    private String id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("symbol")
    @Expose
    private String symbol;
    @SerializedName("rank")
    @Expose
    private String rank;
    @SerializedName("price_usd")
    @Expose
    private String priceUsd;
    @SerializedName("price_btc")
    @Expose
    private String priceBtc;
    @SerializedName("24h_volume_usd")
    @Expose
    private String _24hVolumeUsd;
    @SerializedName("market_cap_usd")
    @Expose
    private String marketCapUsd;
    @SerializedName("available_supply")
    @Expose
    private String availableSupply;
    @SerializedName("total_supply")
    @Expose
    private String totalSupply;
    @SerializedName("max_supply")
    @Expose
    private Object maxSupply;
    @SerializedName("percent_change_1h")
    @Expose
    private String percentChange1h;
    @SerializedName("percent_change_24h")
    @Expose
    private String percentChange24h;
    @SerializedName("percent_change_7d")
    @Expose
    private String percentChange7d;
    @SerializedName("last_updated")
    @Expose
    private String lastUpdated;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public String getRank() {
        return rank;
    }

    public void setRank(String rank) {
        this.rank = rank;
    }

    public String getPriceUsd() {
        return priceUsd;
    }

    public void setPriceUsd(String priceUsd) {
        this.priceUsd = priceUsd;
    }

    public String getPriceBtc() {
        return priceBtc;
    }

    public void setPriceBtc(String priceBtc) {
        this.priceBtc = priceBtc;
    }

    public String get24hVolumeUsd() {
        return _24hVolumeUsd;
    }

    public void set24hVolumeUsd(String _24hVolumeUsd) {
        this._24hVolumeUsd = _24hVolumeUsd;
    }

    public String getMarketCapUsd() {
        return marketCapUsd;
    }

    public void setMarketCapUsd(String marketCapUsd) {
        this.marketCapUsd = marketCapUsd;
    }

    public String getAvailableSupply() {
        return availableSupply;
    }

    public void setAvailableSupply(String availableSupply) {
        this.availableSupply = availableSupply;
    }

    public String getTotalSupply() {
        return totalSupply;
    }

    public void setTotalSupply(String totalSupply) {
        this.totalSupply = totalSupply;
    }

    public Object getMaxSupply() {
        return maxSupply;
    }

    public void setMaxSupply(Object maxSupply) {
        this.maxSupply = maxSupply;
    }

    public String getPercentChange1h() {
        return percentChange1h;
    }

    public void setPercentChange1h(String percentChange1h) {
        this.percentChange1h = percentChange1h;
    }

    public String getPercentChange24h() {
        return percentChange24h;
    }

    public void setPercentChange24h(String percentChange24h) {
        this.percentChange24h = percentChange24h;
    }

    public String getPercentChange7d() {
        return percentChange7d;
    }

    public void setPercentChange7d(String percentChange7d) {
        this.percentChange7d = percentChange7d;
    }

    public String getLastUpdated() {
        return lastUpdated;
    }

    public void setLastUpdated(String lastUpdated) {
        this.lastUpdated = lastUpdated;
    }


Ну что, вам листать не надоело?

Мне кажется разница на лицо. Скажете: ну это модели, с ними такое бывает. Когда я писал адаптер для RecylerView он был длиной всего в 50 строк. Такой же адаптер на джаве занял бы 80 — 90 строк.

5. Нет Getter'ов и Setter'ов


Это одна из главных причин по которой модели в Котлине такие короткие. Для того чтобы поменять значение переменной достаточно просто сделать:

someModel.name = "new name"

В Джаве для того же результата нужно объявить сеттеры, и только потом к ним обращаться. А один сеттер занимает 3 строки кода. И как вы видели в предидущем примере эта разница существенна.

Заключение


На самом деле у Котлина куда больше плюсов, я написал только про те которые явно бросаются в глаза, детальнее про фишки Котлина вы можете почитать в документации языка. В принципе мне он понравился и в следущий раз я его уже буду использовать в реальном проекте. Несмотря на мое упрежденное мнение он показал себя с лучшей стороны. Код куда проще и короче чем на Джаве. Сейчас Котлин это тренд и при этом он быстро набирает обороты. Еще два года тому назад его считали сыроватым и ним пользовалось меньше 5 процентов всех андроидщиков. С таким языком в багаже у вас будет преимущества на собеседованиях, при разработке, а также котлин компилится в байт код JavaScript, что может в один день при смене профиля пригодиться.

Самым важным уроком который я сегодня извлек был: не нужно боятся пробовать что-то новое, возможно, оно даже лучше чем старое.
Only registered users can participate in poll. Log in, please.
На каком языке вы будете кодить дальше?
34.39% Java, эти аргументы неубедительны 163
9.28% перейду на Kotlin прям сегодня 44
16.46% я уже давно на Котлине 78
39.87% Возможно начну кодить на Котлине через месяц другой 189
474 users voted. 154 users abstained.
Tags:
Hubs:
-7
Comments 106
Comments Comments 106

Articles