2017-06-01 24 views
7

Zaczynam uczyć się Kotlina i zauważyłem, że Collections.isEmpty to funkcja, a nie własność. Jednak Collections.size jest właściwością, a nie funkcją.Dlaczego w kolekcji Kotlin nie ma właściwości isEmpty?

W większości (wszystkich?) Kolekcji, oczekuję, że te dwa będą powiązane semantycznie, a implementacja isEmpty może po prostu być size === 0.

Więc ... dlaczego nie jest isEmpty własnością? Czy to po prostu błąd projektu?

+0

Czy może mieć to coś wspólnego z faktem, że istnieje funkcja 'isNotEmpty()' dla 'Kolekcje', która zwraca'! IsEmpty() '? – rozina

Odpowiedz

6

Przy podejmowaniu decyzji, które metody java.util.Collection będzie właściwości w kotlin.collections.Collection następujące kwestie zostały uwzględnione:

  • zarówno size i isEmpty mogą być zakwalifikowane jako właściwości według Kotlin coding conventions jednak size jest nieodłącznym elementem kolekcji i isEmpty jest pochodną właściwości size.
  • przy wdrażaniu kolekcję można zastąpić sizeval nieruchomość z var mienia (prawdopodobnie z prywatnym seter), jednak sama jest rzadko potrzebne do isEmpty.
  • eksponowanie metody jako właściwości wymaga dodatkowych metod generowanych w klasach pochodnych, dlatego też lepiej jest ograniczyć ich liczbę do minimum.
+0

Dzięki za odpowiedź. Nie rozumiem jednak twojego drugiego punktu. Metoda może równie łatwo zostać zmieniona, nieprawdaż? – Ginandi

+0

@Ginandi metoda 'size()' może oczywiście zostać również zmieniona, jednak aby ją zaimplementować, prawdopodobnie będziesz musiał wprowadzić właściwość backing, '_size'. Przez przesłonięcie 'val size' z' var size' (z prywatnym ustawiaczem) uzyskujesz zarówno nadpisanie gettera, jak i pole zaplecza do przechowywania wartości. – Ilya

0

W java masz list.isEmpty() metodę List#isEmpty(). Posiadanie obiektu w kotlinie mogłoby wprowadzić użytkowników w błąd.

IMHO powodem, dla którego The Kotlin-Devs wybierają metodę isNotEmpty metodą, a nie właściwością, jest zgodność z Javą.