
はじめに
こんにちは、sawa です。
最近 AI 系の実装にハマっており、これまでは Java で AI エージェントの実装などを行っていました。
ただし、AI 系のフレームワークは Python や TypeScript の方が充実しているため、TypeScript の学習を進めています。
Java → TypeScript に触れてみて意外ととっつきやすい部分があったり Java との違いに戸惑った部分もあるのでブログにしていきたいと思います。
今回は Java エンジニアが TypeScript のクラス定義を学んだ時の感想について書いていきます。
TypeScript のクラス定義
まずは Java で Student というクラスを定義してみます。
class Student { int id; String name; Student(int id, String name) { this.id = id; this.name = name; } String getName() { return this.name; } } public class Main { public static void main(String[] args) { Student student = new Student(1, "Alice"); System.out.println(student.getName()); } }
Student クラスではプロパティ、コンストラクタ、name を取得する get メソッドを定義しました。
このクラスを TypeScript で定義すると以下のようになります。
class Student { id:number; name:string; constructor(id:number,name:string){ this.id = id; this.name = name; } getName():string{ return this.name; } } let student = new Student(1, "Alice"); console.log(student.getName());
はい、これが TypeScript のクラス定義です。
これを見て私はこのように感じました。
ほぼ Java と同じじゃん!
ほかのスクリプト言語(Python, JavaScript)は動的型付け言語のため、似たような実装でも Java エンジニアは違和感がありますが、TypeScript は型定義が可能なのでより Java に似ている感があります。
Java と TypeScript のクラス定義の違い
コンストラクタ
まずはコンストラクタ定義の違いです。
Java ではコンストラクタを自クラス名で定義しますが、TypeScript は constructor という名前で定義します。
Java
Student(int id, String name) { this.id = id; this.name = name; }
TypeScript
constructor(id:number,name:string){ this.id = id; this.name = name; }
ここは Java と TypeScript で違いはあるものの、constructor という直接的な名前で定義可能なので特に戸惑うことはないかと思いました。
アクセス修飾子
Java のクラス定義で注意するのはアクセス制御ですよね。
アクセス制御に使用するアクセス修飾子は実は TypeScript にもあります。
では Java と TypeScript のアクセス修飾子を違いを見ていきます。
| アクセス修飾子 | Java | TypeScript |
|---|---|---|
| (なし) | 自クラスと同パッケージのクラスからアクセス可能 | public と同等 |
| private | 自クラスからのみアクセス可能 | 自クラスからのみアクセス可能 |
| protected | 自クラスとサブクラスからアクセス可能 | 自クラスとサブクラスからアクセス可能 |
| public | すべてのクラスからアクセス可能 | どこからでもアクセス可能 |
表を見ればわかるかと思いますが、アクセス修飾子の種類は同じですが、一部意味が異なります。
アクセス修飾子なしは Java ではアクセス制御がかかりますが、TypeScript ではアクセス制御はかかりません。(public と同等)
ですので、最初に紹介した Java と TypeScript のクラス定義は同じように見えて厳密には異なるクラス定義となっています。
Java エンジニア視点では、「修飾子を書かない= package 内プライベート」という前提が無い分、TypeScript の方が初見でも挙動を想像しやすいと感じました。
さいごに
TypeScript のクラス定義は Java エンジニアにとってとっつきやすいものでした。
私が Java 脳で Python や JavaScript を触った時に感じていた違和感、戸惑いは TypeScript ではかなり解消されていると感じています。
今後は interface やクラス継承についても学んで Java との違いをブログにしていきたいと思います。