ホームページ  >  記事  >  Java  >  Java と Kotlin の基本構文の詳細な比較

Java と Kotlin の基本構文の詳細な比較

黄舟
黄舟オリジナル
2017-05-21 10:32:271636ブラウズ

この記事では主にKotlinとJavaの基本構文の比較に関する関連情報を紹介しますので、必要な方は参考にしてください

KotlinとJavaの基本構文の比較

KotlinはJavaよりも新しいですが、これは非常に有望な言語です プログラミング 言語であり、そのコミュニティは常に成長しています。 誰もがそれについて話していて、クールだと言っていました。 しかし、なぜそれがそれほど特別なのでしょうか?

Kotlin での Android アプリケーション開発の経験を共有する一連の記事を用意しました。 どの言語が自分にとって最適かを判断できるよう、構文、使いやすさ、UI パフォーマンス、非同期性の観点から Kotlin と Java の違いについて説明します。

基本的な構文の違いから始めましょう。 1 つ目は次のとおりです:

1. Kotlin を使用すると、少ないコードでより多くのことができます

Kotlin の主な利点の 1 つは、そのシンプルさです。 少ないコードでより多くの機能を利用できます。 そして、書くコードが減れば減るほど、ミスも減ります。 これはとても簡単です。

クラスから始めて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)

はい、データクラスに必要なゲッター、セッター、equals()、hashcode()、toString()、copy()関数が自動的に取得されます。 もちろん、これらの関数は簡単にオーバーライドできますが、ほとんどの場合、クラスとそのプロパティを宣言するだけで十分です。

Kotlin が簡潔であるというのは、まさにこれを意味します。

2. NullPointerException を回避することができます

ここで、多くのプログラミング言語における最大の問題である NullPointer 例外について思い出していただきたいと思います。 1965 年に Tony Hall が物事を簡単にしようとしてヌル ポインタを発明して以来、どれだけ多くの開発者がヌル ポインタに悩まされてきたか、私たちには想像もつきません。

残念ながら、トニーがこの間違いを犯すのを防ぐために時間を遡ることはできません。 しかし、Kotlin を使用すると、NullPointerException を簡単にエスケープできるようになりました。

val person: Person? = null
...
person?.name = "John"

変数が null 許容の場合、コンパイラーは適切なチェックを行わずにその変数にアクセスすることを許可しません。 Kotlin は使用を強制しますか? オペレーター。 これにより、アプリケーションが自動的にクラッシュするのを防ぎます。
内部ではどのように機能しますか? 生成されたバイトコードを確認してみましょう。

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

ご覧のとおり、ここには同じ空の小切手があります。 JetBrains の開発者 (Kotlin を作成した人) は、毎回変数をチェックすることが NullPointerException を回避する唯一の方法であることを知っていました。 しかし、彼らは Android 開発者がプロ​​ジェクト内で NullPointerException を扱いたくないことも知っています。 彼らは次のように考えているかもしれません:「変数が null 許容の場合にこのチェックを自動的に生成しないのはなぜですか?

JetBrains の開発者がそれを実行し、私たちの作業を楽にしてくれました!

3. util クラスを削除できます

util クラスの使用に関する厄介な点について話しましょう。これまでに、util クラスを使用しないプロジェクトを作成したことがありますか? Kotlin には、すべての util クラスを完全に削除するための賢い解決策が用意されています。
拡張関数はほぼ通常の Kotlin 関数ですが、それを宣言するときは、インスタンスに拡張関数が含まれるクラスを指定する必要があります。

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



これは、クラスのインスタンスではなく、Context インスタンスであることに注意してください。アクティビティまたは他の Context インスタンスから直接実行できます。例:


toast("Hi")

拡張関数は、元のクラスを変更せずにどのように機能するかを覚えておく必要があります。


public final toast(Landroid/content/Context;Ljava/lang/String;)V
  @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
  @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 1
  L0
  ALOAD 1
  LDC "$receiver"
  INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
  ALOAD 2
  LDC "text"
  INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
  L1
  LINENUMBER 31 L1
  ALOAD 1
  ALOAD 2
  CHECKCAST java/lang/CharSequence
  ICONST_0
  INVOKESTATIC android/widget/Toast.makeText (Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
  INVOKEVIRTUAL android/widget/Toast.show ()V
  L2
  LINENUMBER 32 L2
  RETURN
  L3
  LOCALVARIABLE this Ligalata/com/kotlinexample/MainActivity; L0 L3 0
  LOCALVARIABLE $receiver Landroid/content/Context; L0 L3 1
  LOCALVARIABLE text Ljava/lang/String; L0 L3 2
  MAXSTACK = 3
  MAXLOCALS = 3

ハッ! 関数は最初の引数として拡張されたクラスのインスタンスを暗黙的に受け取るため、関数本体内の "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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。