はじめに
JavaとC#は、企業の基幹システムを支える主力言語として広く採用されているされています。
この2つのプログラミング言語を、実践的な視点から比較してみました。
1. 基本的な言語機能の比較
プロパティの実装
Java
java
public class Person {
private String name;
// Getter/Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
C#
C#
public class Person
{
// 自動実装プロパティ
public string Name { get; set; }
// バッキングフィールドを使用する場合
private string _name;
public string Name
{
get => _name;
set => _name = value;
}
}
レコード型の比較
Java
java
public record Person(String name, int age) {
// コンパクトなイミュータブルなデータ型
// equals(), hashCode(), toString()が自動生成
}
C#
C#
// イミュータブルなレコード
public record Person(string Name, int Age);
// レコードクラス(ミュータブル)
public record class MutablePerson
{
public string Name { get; set; }
public int Age { get; set; }
}
2. 非同期処理の実装
非同期処理の基本
Java(CompletableFuture)
java
public class AsyncService {
public CompletableFuture<String> fetchDataAsync() {
return CompletableFuture.supplyAsync(() -> {
// 非同期処理
return "データ";
});
}
public void handleData() {
fetchDataAsync()
.thenAccept(data -> System.out.println(data))
.exceptionally(error -> {
System.err.println(error);
return null;
});
}
}
C#(async/await)
C#
public class AsyncService
{
public async Task<string> FetchDataAsync()
{
await Task.Delay(1000); // 非同期処理の模擬
return "データ";
}
public async Task HandleDataAsync()
{
try
{
var data = await FetchDataAsync();
Console.WriteLine(data);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
3. コレクション操作とLINQ vs Stream API
データ処理の比較
Java(Stream API)
java
List<Person> people = getPeople();
var adults = people.stream()
.filter(p -> p.age() >= 18)
.map(Person::name)
.sorted()
.collect(Collectors.toList());
C#(LINQ)
C#
List<Person> people = GetPeople();
var adults = people
.Where(p => p.Age >= 18)
.Select(p => p.Name)
.OrderBy(name => name)
.ToList();
4. 最新の言語機能
パターンマッチング
Java
java
Object obj = getValue();
if (obj instanceof String str && !str.isEmpty()) {
System.out.println(str);
} else if (obj instanceof Integer i && i > 0) {
System.out.println("正の整数: " + i);
}
C#
C#
object obj = GetValue();
switch (obj)
{
case string str when !string.IsNullOrEmpty(str):
Console.WriteLine(str);
break;
case int i when i > 0:
Console.WriteLine($"正の整数: {i}");
break;
}
// C# 12のリスト型パターン
int[] numbers = [1, 2, 3];
if (numbers is [var first, _, var last])
{
Console.WriteLine($"First: {first}, Last: {last}");
}
5. エコシステムの比較
ビルドツール
- Java: Maven, Gradle
- C#: MSBuild (Visual Studio), .NET CLI
主要フレームワーク
- Java: Spring Boot, Jakarta EE
- C#: .NET Core, ASP.NET Core
パッケージ管理
- Java: Maven Central, JCenter
- C#: NuGet
6. パフォーマンスとメモリ管理
ガベージコレクション
- Java: G1GC, ZGC, Shenandoah
- C#: マーク・アンド・スイープ(世代別GC)
値型の扱い
Java
java
// プリミティブ型とラッパー型が分かれている
int number = 42; // スタック上
Integer boxed = 42; // ヒープ上
C#
C#
// 統一された型システム
int number = 42; // スタック上
object boxed = 42; // ボックス化されヒープ上
Span<int> numbers = stackalloc int[100]; // スタック上の配列
7. 開発生産性の比較
IDEサポート
- Java: IntelliJ IDEA, Eclipse, NetBeans
- C#: Visual Studio, Visual Studio Code, Rider
ホットリロード
- Java: JRebel, Spring Dev Tools
- C#: .NET Hot Reload
結論
Javaの長所
- プラットフォーム非依存性が高い
- エンタープライズでの実績が豊富
- オープンソースエコシステムが成熟
- 保守的な言語進化による安定性
C#の長所
- 言語機能が先進的
- Visual Studioの充実した開発環境
- Unity等のゲーム開発での強み
- Windows環境との親和性
選択の指針
- エンタープライズシステム:両言語とも適している
- クロスプラットフォーム:Java
- Windows特化システム:C#
- ゲーム開発:C# (Unity)
- マイクロサービス:両言語とも適している