> Java > java지도 시간 > 본문

Java와 Kotlin의 기본 구문에 대한 자세한 비교

黄舟
풀어 주다: 2017-05-21 10:32:27
원래의
1633명이 탐색했습니다.

이 글은 주로 Kotlin과 Java의 기본 구문 비교에 대한 관련 정보를 소개합니다. 필요한 친구들은 참고하면 됩니다.

Kotlin과 Java의 기본 구문 비교

Kotlin Java보다 젊지만 매우 유망한 프로그래밍 언어이며 Kotlin 커뮤니티는 지속적으로 성장하고 있습니다. 모두가 그것에 대해 이야기하고 있었고 멋지다고 말했습니다. 그런데 왜 그렇게 특별할까요? Kotlin에서 Android
애플리케이션을 개발한 경험을 공유하기 위해 일련의 기사를 준비했습니다. 어떤 언어가 자신에게 가장 적합한지 결정할 수 있도록 구문, 유용성, UI 성능, 비동기성 측면에서 Kotlin과 Java의 차이점을 논의하겠습니다.

몇 가지 기본적인 구문 차이점부터 살펴보겠습니다. 첫 번째는 다음과 같습니다.

1. Kotlin을 사용하면 더 적은 코드로 더 많은 작업을 수행할 수 있습니다.

Kotlin의 주요 장점은 단순함입니다. 그것. 더 적은 코드로 더 많은 기능을 얻을 수 있습니다. 그리고 코드를 적게 작성할수록 실수도 줄어듭니다. 매우 간단합니다.
클래스부터 시작하여 Kotlin의 기본을 살펴보겠습니다.

public final class Person {
  private String name;
  private int age;
  private float height;

  public Person(String name, int age, float height) {
    this.name = name;
    this.age = age;
    this.height = height;
  }

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
    this.height = 1.8f;
  }

  public String getName() {
    return name;
  }

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

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public float getHeight() {
    return height;
  }

  public void setHeight(float height) {
    this.height = height;
  }

  @Override
  public String toString() {
    return "Person{" +
        "name='" + name + '\'' +
        ", age=" + age +
        ", height=" + height +
        '}';
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Person person = (Person) o;

    if (age != person.age) return false;
    if (Float.compare(person.height, height) != 0) return false;
    return name != null ? name.equals(person.name) : person.name == null
  }

  @Override
  public int hashCode() {
    int result = name != null ? name.hashCode() : 0;
    result = 31 * result + age;
    result = 31 * result + (height != +0.0f ? Float.floatToIntBits(height) : 0);
    return result;
  }  
}
로그인 후 복사

위는 일반적인 Java 클래스입니다. 별로 효과가 없습니다. 단지 일부 데이터가 포함되어 있을 뿐입니다. 그러나 이 코드가 테이블에 가져오는 단점을 깨달을 때 이 코드가 얼마나 큰지 확인하는 것은 고통스럽습니다. 여러분을 격려하기 위해 Kotlin으로 작성된 동등한 수업을 제공할 것입니다.

data class Person(var name: String,
         var age: Int,
         var height: Float = 1.8f)
로그인 후 복사

예, 데이터 클래스에 필요한 getter, setter, equals(), hashcode(), toString() 및

copy

()

함수를 자동으로 가져옵니다.

! 물론 이러한 함수를 쉽게 재정의할 수 있지만 대부분의 경우 클래스와 클래스의 속성을 선언하는 것만으로도 충분합니다. Kotlin이 간결하다고 말하는 것은 바로 이러한 의미입니다.

2. NullPointer를 피할 수 있습니다

예외

이제 우리는 많은 프로그래밍 언어에서 가장 큰 어려움을 상기시키고 싶습니다. - 널 포인터가 비정상적입니다. Tony Hall이 1965년에 일을 더 단순하게 만들려고 노력하면서 널 포인터를 발명한 이후로 얼마나 많은 개발자가 널 포인터로 인해 어려움을 겪었는지 상상할 수 없습니다.

안타깝게도 Tony가 이런 실수를 저지르는 것을 방지하기 위해 제 시간에 돌아올 수 없습니다. 하지만 Kotlin을 사용하면 이제 NullPointerException을 쉽게 피할 수 있습니다.

val person: Person? = null
...
person?.name = "John"
로그인 후 복사

변수

가 null을 허용하는 경우 컴파일러는 적절한 검사 없이는 해당 변수에 액세스하는 것을 허용하지 않습니다. Kotlin이 이를 사용하도록 강요하나요?

운영자

. 이렇게 하면 애플리케이션이 자동으로 충돌하는 것을 방지할 수 있습니다. 내부적으로는 어떻게 작동하나요? 생성된 바이트코드를 검토해 보겠습니다. rree보시다시피 여기에도 동일한 빈 수표가 있습니다. Kotlin을 만든 JetBrains 개발자는 매번 변수를 확인하는 것이 NullPointerException을 피할 수 있는 유일한 방법이라는 것을 알고 있습니다. 그러나 그들은 Android 개발자가 프로젝트에서 NullPointerException을 처리하고 싶어하지 않는다는 것도 알고 있습니다. 그들은 다음과 같이 생각할 수도 있습니다. "변수가 nullable인 경우 자동으로 이 검사를 생성하지 않는 이유는 무엇입니까?

JetBrains 개발자는 이 작업을 수행하여 우리의 삶을 더 쉽게 만듭니다!


3 . util 클래스를 제거할 수 있습니다

util 클래스가 없는 프로젝트를 해본 적이 있나요? 영리한 솔루션입니다. 확장 함수 - 모든 유틸리티 클래스를 완전히 제거하는 데 도움이 됩니다.

확장 함수는 거의 일반적인 Kotlin 함수이지만 선언할 때 인스턴스가 가질 내용을 지정해야 합니다. 기능을 확장하는 클래스.

fun Context.toast(text: String) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show()

'이것'이 무엇인지 참고하세요. makeText() 메소드에 전달된 매개변수로 사용합니까? 이것은 이 함수를 선언하는 클래스의 인스턴스가 아니라 Context 인스턴스입니다. 이제 Activity 또는 다른 Context 인스턴스에서 이 함수를 직접 호출할 수 있습니다. >

L2
LINENUMBER 18 L2
ALOAD 3
DUP
IFNULL L3
LDC "John"
INVOKEVIRTUAL igalata/com/kotlinexample/Person.setName (Ljava/lang/String;)V
GOTO L4
L3
POP
로그인 후 복사

확장 함수는 어떤 식으로든 확장한 클래스를 수정하지 않는다는 점을 기억해야 하는데, 원래 클래스를 변경하지 않고 어떻게 작동하는지 바이트코드를 다시 살펴볼까요? >


toast("Hi")
로그인 후 복사

하! 함수는 암시적으로 첫 번째 인수로 확장된 클래스의 인스턴스를 받습니다. 본문에서 "this"에 대한 모든 액세스는 액세스로 대체됩니다. 실제로는 이 기능을 프로젝트의 어느 곳에서나 사용할 수 있습니다.


바인딩은 필요하지 않습니다. 🎜>


你还记得findViewById()method()吗? 我们相信你不喜欢它。 我们也不是。 此外,我们不想为我们需要访问的每个视图声明变量和Butterknife注释

你可以忘记与Kotlin Android Extensions的视图绑定。 不再需要创建变量和绑定视图。 您可以使用在xml布局中声明的标识符直接访问您的视图。


public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button) findViewById(R.id.button);
    final TextView text = (TextView) findViewById(R.id.text); 
    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        text.setText("You've clicked a button");
      }
    });
  }
}

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
    super.onCreate(savedInstanceState, persistentState)
    setContentView(R.layout.activity_main)

    button.setOnClickListener { text.text = "You've clicked a button" }
  }
}
로그인 후 복사

这太简单了,不是吗?

基本上,findViewById()方法仍在使用中。 但是没有必要自己写。 Kotlin会为你做。

当您使用Android扩展时,findCachedViewById()函数和HashMap实例将会自动生成。 每次通过其标识符访问您的视图将被一个新的函数调用替换。 如果是第一次访问视图,此函数将调用通常的findViewById()函数,并将接收的视图添加到HashMap中,以便在下次访问视图时从中检索视图。

5. 你可以更容易地使用集合

让我们谈谈Kotlin的集合。 因为我们经常需要使用数据模型集合执行困难的操作。 例如,我们可能有一个学生名单,我们需要从中检索三个A级成绩的学生和两个B成绩的学生。

看看Kotlin的解决方案:


var students = listOf(Student("John", 0), Student("Julia", 2), Student("Matt", 1),
        Student("Katie", 0), Student("Dan", 0))

var firstList = students.filter { it.mark == 0 }.take(3)
var secondList = students.filter { it.mark == 1 }.take(2)
로그인 후 복사

下面是我们如何解决Java中的同样的问题:


ArrayList<Student> students = new ArrayList<Student>() {{
      add(new Student("John", 0));
      add(new Student("Julia", 2));
      add(new Student("Matt", 1));
      add(new Student("Katie", 0));
      add(new Student("Dan", 0));
}};

ArrayList<Student> firstList = new ArrayList<>();
ArrayList<Student> secondList = new ArrayList<>();

for (Student student: students) {
      boolean isFirstFilled = firstList.size() >= 3;
      boolean isSecondFilled = secondList.size() >= 2;

      if (isFirstFilled && isSecondFilled) break;
      int mark = student.getMark();
      if (mark == 0 && !isFirstFilled) {
        firstList.add(student);
      } else if (mark == 1 && !isSecondFilled) {
        secondList.add(student);
      }
    }
로그인 후 복사

这只是一个小例子,说明如何在Kotlin和Java中使用集合,但你可以看到差别! 你能想象如果我们处理一个大项目的集合,Kotlin会有什么区别吗?

위 내용은 Java와 Kotlin의 기본 구문에 대한 자세한 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿