プログラミング言語の比較 > クラスとインスタンス

値を変更できる(mutable)人物クラス

名前と年齢を保持するクラスを定義して、インスタンス化し、名前と年齢をセットして文字列に変換する。

Java

  1. class Person {
  2. private String name;
  3. private int age;
  4. public String getName() { return name; }
  5. public void setName(String name) { this.name = name; }
  6. public int getAge() { return age; }
  7. public void setAge(int age) { this.age = age; }
  8. @Override
  9. public String toString() {
  10. return String.format("%s (%d years old)", name, age);
  11. }
  12. }
  1. Person p = new Person();
  2. p.setName("Taro");
  3. p.setAge(20);
  4. String s = p.toString();

Groovy

  1. class Person {
  2. String name
  3. int age
  4. @Override String toString() { "${name} (${age} years old)" }
  5. }
  1. def p = new Person(name: 'Taro', age: 20)
  2. def s = p.toString()

Kotlin

  1. class Person {
  2. var name: String? = null
  3. var age = 0
  4. override fun toString() = "$name ($age years old)"
  5. }
  1. val p = Person()
  2. p.name = "Taro"
  3. p.age = 20
  4. val s = p.toString()

Scala

  1. class Person {
  2. var name: String = _
  3. var age: Int = _
  4. override def toString = "%s (%d years old)".format(name, age)
  5. }
  1. class Person(var name: String, var age: Int) {
  2. def this() = this(null, 0)
  3. override def toString = "%s (%d years old)".format(name, age)
  4. }
  1. val p = new Person
  2. p.name = "Taro"
  3. p.age = 20
  4. val s = p.toString

F#

  1. type Person() =
  2. member val Name = "" with get, set
  3. member val Age = 0 with get, set
  4. override this.ToString() = sprintf "%s (%d years old)" this.Name this.Age
  1. let p = new Person()
  2. p.Name <- "Taro"
  3. p.Age <- 20
  4. let s = p.ToString()

C#

  1. class Person {
  2. public string Name { get; set; }
  3. public int Age { get; set; }
  4. public override string ToString() {
  5. return $"{Name} ({Age} years old)";
  6. }
  7. }
  1. var p = new Person { Name = "Taro", Age = 20 };
  2. string s = p.ToString();

C++

  1. #include <strstream>
  2. class person {
  3. public:
  4. string name;
  5. int age;
  6. operator string();
  7. };
  8. // person クラスから文字列への変換関数
  9. person::operator string() {
  10. strstream ss;
  11. ss << name << " (" << age << " years old)";
  12. return ss.str();
  13. }
  1. person p;
  2. p.name = "Taro";
  3. p.age = 20;
  4. string s = p;
  1. person p;
  2. p.name = "Taro";
  3. p.age = 20;
  4. string s = static_cast<string>(p);

Go

  1. type Person struct {
  2. Name string
  3. Age int
  4. }
  5. func (this *Person) String() string {
  6. return fmt.Sprintf("%s (%d years old)", this.Name, this.Age)
  7. }
  1. p := Person{"Taro", 20}
  2. s := p.String()
  1. p := Person{Name: "Taro", Age: 20}
  2. s := p.String()
  1. var p Person
  2. p.Name = "Taro"
  3. p.Age = 20
  4. s := p.String()

Rust

  1. pub struct Person<'a> {
  2. pub name: &'a str,
  3. pub age: i32,
  4. }
  5. impl<'a> fmt::Display for Person<'a> {
  6. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  7. write!(f, "{} ({} years old)", self.name, self.age)
  8. }
  9. }
  1. let mut p = Person {
  2. name: "",
  3. age: 0,
  4. };
  5. p.name = "Taro";
  6. p.age = 20;
  7. let s = format!("{p}");

Dart

  1. class Person {
  2. String? _name;
  3. String? get name => _name;
  4. set name(String? name) => _name = name;
  5. int? _age;
  6. int? get age => _age;
  7. set age(int? age) => _age = age;
  8. toString() => '$name ($age years old)';
  9. }
  1. var p = Person();
  2. p.name = 'Taro';
  3. p.age = 20;
  4. var s = p.toString();

TypeScript

  1. class Person {
  2. name: string;
  3. age: number;
  4. toString() {
  5. return `${this.name} (${this.age} years old)`
  6. }
  7. }
  1. let p = new Person();
  2. p.name = 'Taro';
  3. p.age = 20;
  4. let s = p.toString();

JavaScript

  1. class Person {
  2. name;
  3. age;
  4. toString() {
  5. return `${this.name} (${this.age} years old)`;
  6. }
  7. }
  1. let p = new Person();
  2. p.name = 'Taro';
  3. p.age = 20;
  4. let s = String(p);

CoffeeScript

  1. class Person
  2. constructor: (@name, @age) ->
  3. toString: -> "#{@name} (#{@age} years old)"
  1. p = new Person 'Taro', 20
  2. s = String p

Ruby

  1. class Person
  2. attr_accessor :name, :age
  3. def to_s
  4. "#{name} (#{age} years old)"
  5. end
  6. end
  1. p = Person.new
  2. p.name = 'Taro'
  3. p.age = 20
  4. s = p.to_s

Python

  1. class Person:
  2. name = None # 省略可
  3. age = None # 省略可
  4. def __str__(self):
  5. return '%s (%d years old)' % (self.name, self.age)
  1. p = Person()
  2. p.name = 'Taro'
  3. p.age = 20
  4. s = str(p)

PHP

  1. class Person {
  2. public $name;
  3. public $age;
  4. public function __toString() {
  5. return "{$this->name} ({$this->age} years old)";
  6. }
  7. }
  1. $p = new Person();
  2. $p->name = 'Taro';
  3. $p->age = 20;
  4. $s = (string)$p;

PHP

PHP 7.4以降
  1. class Person {
  2. public string $name;
  3. public int $age;
  4. public function __toString() {
  5. return "{$this->name} ({$this->age} years old)";
  6. }
  7. }

Perl

  1. package Person;
  2. use overload q/""/ => sub { # 文字列への変換関数
  3. my $self = shift;
  4. "$self->{name} ($self->{age} years old)";
  5. };
  6. sub new {
  7. my $class = shift;
  8. bless {}, $class;
  9. }
  1. # use Person;
  2. my $p = Person->new;
  3. $p->{name} = 'Taro';
  4. $p->{age} = 20;
  5. my $s = "$p";
CPAN の Class::Accessor::Lvalue を使った場合
  1. package Person;
  2. use base qw/Class::Accessor::Lvalue::Fast/;
  3. use overload q/""/ => sub { # 文字列への変換関数
  4. my $self = shift;
  5. "$self->{name} ($self->{age} years old)";
  6. };
  7. __PACKAGE__->mk_accessors(qw/name age/); # ゲッター・セッターを作る
  1. # use Person;
  2. my $p = Person->new;
  3. $p->name = 'Taro';
  4. $p->age = 20;
  5. my $s = "$p";
CPAN の Class::MethodMaker を使った場合
  1. package Person;
  2. use overload q/""/ => sub { # 文字列への変換関数
  3. my $self = shift;
  4. "$self->{name} ($self->{age} years old)";
  5. };
  6. use Class::MethodMaker [
  7. new => [qw/new/], # コンストラクタを作る
  8. scalar => [qw/name age/], # ゲッター・セッターを作る
  9. ];
  1. # use Person;
  2. my $p = Person->new;
  3. $p->name('Taro');
  4. $p->age(20);
  5. my $s = "$p";

値を変更できない(immutable)人物クラス

インスタンス化の際に引数で名前と年齢を指定し、その後それらの値を読み出す。

Java

  1. class Person {
  2. private final String name;
  3. private final int age;
  4. public Person(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. public String getName() { return name; }
  9. public int getAge() { return age; }
  10. }
  1. Person p = new Person("Taro", 20);
  2. String name = p.getName();
  3. int age = p.getAge();
Java 16以降
  1. record Person(String name, int age) {}
  1. Person p = new Person("Taro", 20);
  2. String name = p.name();
  3. int age = p.age();

Groovy

  1. class Person {
  2. private final name
  3. private final age
  4. Person(name, age) {
  5. this.name = name
  6. this.age = age
  7. }
  8. String getName() { name }
  9. int getAge() { age }
  10. }
  1. def p = new Person("Taro", 20)
  2. def name = p.name
  3. def age = p.age

Kotlin

  1. class Person(val name: String, val age: Int)
  1. val p = Person("Taro", 20)
  2. val name = p.name
  3. val age = p.age

Scala

  1. class Person(val name: String, val age: Int)
  1. val p = new Person("Taro", 20)
  2. val name = p.name
  3. val age = p.age
  1. case class Person(name: String, age: Int)
  1. val p = Person("Taro", 20)
  2. val name = p.name
  3. val age = p.age

Haskell

  1. data Person = Person {name :: String, age :: Integer}
  2. instance Show Person where
  3. show = \ p -> (name p) ++ " (" ++ (show $ age p) ++ " years old)"
  1. let p = Person "Taro" 20
  2. let name' = name p
  3. let age' = age p

F#

  1. type Person(name : string, age: int) =
  2. member val Name = name with get
  3. member val Age = age with get
  1. let p = new Person("Taro", 20)
  2. let name = p.Name
  3. let age = p.Age

C#

C# 6.0以降
  1. class Person {
  2. public string Name { get; }
  3. public int Age { get; }
  4. public Person(string name, int age) {
  5. Name = name;
  6. Age = age;
  7. }
  8. }
  1. var p = new Person("Taro", 20);
  2. string name = p.Name;
  3. int age = p.Age;
C# 7.0以降
  1. class Person {
  2. public string Name { get; }
  3. public int Age { get; }
  4. public Person(string name, int age) => (Name, Age) = (name, age);
  5. }
C# 9.0以降
  1. record Person(string Name, int Age);

C++

  1. class person {
  2. public:
  3. person(const string name, const int age) : _name(name), _age(age) {}
  4. string name() const { return _name; }
  5. int age() const { return _age; }
  6. private:
  7. const string _name;
  8. const int _age;
  9. };
  1. person p("Taro", 20);
  2. string name = p.name();
  3. int age = p.age();
  1. person* p = new person("Taro", 20);
  2. string name = p->name();
  3. int age = p->age();
  4. delete p;

Go

  1. type Person struct {
  2. name string // 小文字で始まるフィールドは private になるので外から見えない
  3. age int
  4. }
  5. func (this *Person) Name() string { // public なゲッター
  6. return this.name
  7. }
  8. func (this *Person) Age() int {
  9. return this.age
  10. }
  1. p := Person{"Taro", 20}
  2. name := p.Name()
  3. age := p.Age()
  1. p := Person{name: "Taro", age: 20}
  2. name := p.Name()
  3. age := p.Age()

Rust

  1. pub struct Person<'a> {
  2. name: &'a str,
  3. age: i32,
  4. }
  5. impl<'a> Person<'a> {
  6. fn name(&self) -> &'a str {
  7. self.name
  8. }
  9. fn age(&self) -> i32 {
  10. self.age
  11. }
  12. }
  1. let p = Person {
  2. name: "Taro",
  3. age: 20,
  4. };
  5. let name = p.name();
  6. let age = p.age();

Dart

  1. class Person {
  2. final String _name;
  3. get name => _name;
  4. final int _age;
  5. get age => _age;
  6. Person(this._name, this._age);
  7. }
  1. var p = new Person('Taro', 20);
  2. var name = p.name;
  3. var age = p.age;

TypeScript

  1. class Person {
  2. constructor(readonly name: string, readonly age: number) {}
  3. }
  1. let p = new Person('Taro', 20);
  2. let name = p.name;
  3. let age = p.age;

JavaScript

  1. class Person {
  2. #name;
  3. #age;
  4. constructor(name, age) {
  5. this.#name = name;
  6. this.#age = age;
  7. }
  8. get name() {
  9. return this.#name;
  10. }
  11. get age() {
  12. return this.#age;
  13. }
  14. }
  1. let p = new Person('Taro', 20);
  2. let name = p.name;
  3. let age = p.age;

CoffeeScript

  1. class Person
  2. constructor: (name, age) ->
  3. Object.defineProperty @, 'name', value: name
  4. Object.defineProperty @, 'age', value: age
  1. p = new Person 'Taro', 20
  2. name = p.name
  3. age = p.age

Ruby

  1. class Person
  2. attr_reader :name, :age
  3. def initialize name, age
  4. @name = name
  5. @age = age
  6. end
  7. end
  1. p = Person.new 'Taro', 20
  2. name = p.name
  3. age = p.age

Python

  1. class Person:
  2. def __init__(self, name, age):
  3. self.__name = name
  4. self.__age = age
  5. def name(self): return self.__name
  6. def age(self): return self.__age
  1. p = Person('Taro', 20)
  2. name = p.name()
  3. age = p.age()
Python 3.7以降
  1. # import dataclasses
  2. @dataclasses.dataclass(frozen=True)
  3. class Person:
  4. name: str
  5. age: int
  1. p = Person('Taro', 20)
  2. name = p.name
  3. age = p.age

PHP

  1. class Person {
  2. private $_name;
  3. private $_age;
  4. public function __construct($name, $age) {
  5. $this->_name = $name;
  6. $this->_age = $age;
  7. }
  8. public function name() {
  9. return $this->_name;
  10. }
  11. public function age() {
  12. return $this->_age;
  13. }
  14. }
  1. $p = new Person('Taro', 20);
  2. $name = $p->name();
  3. $age = $p->age();

Perl

  1. package Person;
  2. sub new {
  3. my $class = shift;
  4. my $self;
  5. $self->{$_} = shift for qw/name age/;
  6. bless $self, $class;
  7. }
  8. sub name {
  9. shift->{name};
  10. }
  11. sub age {
  12. shift->{age};
  13. }
  1. # use Person;
  2. my $p = Person->new('Taro', 20);
  3. my $name = $p->name;
  4. my $age = $p->age;
CPAN の Class::Accessor::Lvalue を使った場合
  1. package Person;
  2. use base qw/Class::Accessor::Lvalue::Fast/;
  3. our @keys = qw/name age/;
  4. __PACKAGE__->mk_ro_accessors(@keys); # ゲッターを作る
  5. sub new {
  6. my $class = shift;
  7. my $self = $class->SUPER::new; # コンストラクタをオーバーライドする
  8. $self->{$_} = shift for @keys;
  9. $self;
  10. }
  1. # use Person;
  2. my $p = Person->new('Taro', 20);
  3. my $name = $p->name;
  4. my $age = $p->age;

クラス名の文字列を元にインスタンスを生成する

Java

  1. String className = "Person";
  2. Object p = Class.forName(className).getConstructors()[0].newInstance("Taro", 20);

Groovy

  1. def className = 'Person'
  2. def p = Class.forName(className).getConstructors()[0].newInstance('Taro', 20)

Kotlin

  1. val className = "Person"
  2. val p = Class.forName(className).getConstructors()[0].newInstance("Taro", 20)

Scala

  1. val className = "Person"
  2. val p = Class.forName(className).getConstructors()(0).newInstance("Taro", 20.asInstanceOf[AnyRef])
  1. val className = "Person"
  2. val args = List("Taro", 20).map(_.asInstanceOf[AnyRef]).toArray
  3. val p = Class.forName(className).getConstructors()(0).newInstance(args: _*)

F#

  1. let className = "Person"
  2. let p = System.Type.GetType(className).GetConstructors().[0].Invoke [|"Taro"; 20|]

C#

  1. string className = "Person";
  2. object p = Type.GetType(className).GetConstructors()[0].Invoke(new object[] { "Taro", 20 });

TypeScript

  1. let className = 'Person';
  2. let p = new (eval(className))('Taro', 20);

JavaScript

  1. let className = 'Person';
  2. let p = new (eval(className))('Taro', 20);

CoffeeScript

  1. className = 'Person'
  2. p = new (eval className) 'Taro', 20

Ruby

  1. class_name = 'Person'
  2. p = eval(class_name).new('Taro', 20)

Python

  1. class_name = 'Person'
  2. p = eval(class_name)('Taro', 20)

PHP

  1. $className = 'Person';
  2. $p = new $className('Taro', 20);

Perl

  1. my $class_name = 'Person';
  2. my $p = $class_name->new('Taro', 20);

文字列クラスの3世代親のクラスを取得する(なければ null)

Java

  1. Class<?> clazz = "".getClass();
  2. for (int i = 0; i < 3; i++) {
  3. clazz = clazz.getSuperclass();
  4. if (clazz == null) break;
  5. }

Groovy

  1. def clazz = ''.class
  2. 3.times { clazz = clazz?.superclass }

Kotlin

  1. var clazz: Class<*>? = "".javaClass
  2. (1..3).forEach { clazz = clazz?.getSuperclass() }

Scala

  1. var clazz = "".getClass
  2. (1 to 3).foreach(_ => if (clazz != null) clazz = clazz.getSuperclass)

F#

  1. let f (typ : Type) _ =
  2. match typ with
  3. | null -> null
  4. | typ -> typ.BaseType
  5. let typ = Seq.fold f ("".GetType()) [1..3]
  1. let f = function
  2. | null -> null
  3. | (typ : Type) -> typ.BaseType
  4. let typ = Seq.fold (fun typ _ -> f typ) ("".GetType()) [1..3]
  1. let mutable typ = "".GetType()
  2. for i = 1 to 3 do
  3. match typ with
  4. | null -> ()
  5. | t -> typ <- t.BaseType

C#

  1. Type type = "".GetType();
  2. for (int i = 0; i < 3; i++) {
  3. type = type.BaseType;
  4. if (type == null) break;
  5. }
C# 6.0以降
  1. Type type = "".GetType();
  2. for (int i = 0; i < 3; i++) {
  3. type = type?.BaseType;
  4. }

Ruby

  1. clazz = ''.class
  2. 3.times { clazz = clazz.superclass unless clazz.nil? }

Python

文字列クラスが多重継承をしていない前提でなら
  1. # import inspect
  2. t = type('')
  3. try:
  4. t = inspect.getmro(t)[3]
  5. except IndexError:
  6. None

オブジェクトの内容(メンバー変数の名前と値)を文字列で表す

Java

Commons Lang を使った場合
  1. // import org.apache.commons.lang3.builder.ToStringBuilder;
  2. Object = ... // 任意のオブジェクト
  3. String s = ToStringBuilder.reflectionToString(obj);

Groovy

  1. def obj = ... // 任意のオブジェクト
  2. def s = obj.dump()

Scala

case class の場合。名前は含まれないが…
  1. val obj = ... // case class のオブジェクト
  2. val s = obj.toString

Go

  1. obj := ... // 任意の値
  2. s := fmt.Sprint(obj)

TypeScript

Node.js の場合
  1. // import * as util from 'util';
  2. let obj = ...
  3. let s = util.inspect(obj);

JavaScript

Node.js の場合
  1. // const util = require('util');
  2. let obj = ...
  3. let s = util.inspect(obj);

CoffeeScript

Node.js の場合
  1. # util = require 'util'
  2. obj = ...
  3. s = util.inspect obj

Ruby

  1. obj = ... # 任意のオブジェクト
  2. s = obj.inspect

Python

  1. obj = ... # 任意のオブジェクト
  2. s = repr(obj.__dict__)
もう少し見栄えを良くしたければ
  1. # import re
  2. obj = ... # 任意のオブジェクト
  3. r = re.compile('^_.+__')
  4. s = ', '.join(r.sub('__', name) + ': ' + repr(value) for name, value in obj.__dict__.items())

PHP

  1. $obj = ... // 任意のオブジェクト
  2. $s = var_export($obj, true);
もう少し見栄えを良くしたければ
  1. $obj = ... // 任意のオブジェクト
  2. $vars = get_object_vars($obj);
  3. foreach ($vars as $name => &$value) {
  4. $value = $name . ': ' . var_export($value, true);
  5. }
  6. $s = implode(', ', $vars);

Perl

  1. # use Data::Dumper;
  2. my $obj = ...; # 任意のオブジェクト
  3. my $s = Dumper($obj);

既存のクラスにメソッドを追加する

Groovy

メタクラスを使う方法
  1. String.metaClass.up = { delegate.toUpperCase() }
カテゴリーを使う方法
  1. class StringCategory {
  2. static up(String s) {
  3. s.toUpperCase()
  4. }
  5. }
  1. use (StringCategory.class) {
  2. println 'abc'.up() // StringCategory.up('abc') と解釈される
  3. }

Kotlin

  1. fun String.up() = this.toUpperCase()
  1. println("abc".up())

Scala

Scala 3.0以降
  1. extension (s: String)
  2. def up = s.toUpperCase
  1. println("abc".up) // new StringEx("abc").up() と解釈される

C#

  1. public static class StringEx {
  2. public static string Up(this string s) {
  3. return s.ToUpper();
  4. }
  5. }

TypeScript

  1. declare global {
  2. interface String {
  3. up(): string;
  4. }
  5. }
  6. String.prototype.up = function() {
  7. return this.toUpperCase();
  8. };

JavaScript

  1. String.prototype.up = function() { return this.toUpperCase(); };

CoffeeScript

  1. String::up = -> @toUpperCase()

Ruby

  1. class String
  2. def up
  3. upcase
  4. end
  5. end
  1. module StringEx
  2. refine String do
  3. def up
  4. upcase
  5. end
  6. end
  7. end
  1. using StringEx
  2. puts 'abc'.up

戻る

目次

値を変更できる(mutable)人物クラス Java Groovy Kotlin Scala Erlang Haskell PowerShell F# C# C++ Go Rust Dart TypeScript JavaScript CoffeeScript Ruby Python PHP Perl
値を変更できない(immutable)人物クラス Java Groovy Kotlin Scala Erlang Haskell PowerShell F# C# C++ Go Rust Dart TypeScript JavaScript CoffeeScript Ruby Python PHP Perl
クラス名の文字列を元にインスタンスを生成する Java Groovy Kotlin Scala Erlang Haskell PowerShell F# C# C++ Go Rust Dart TypeScript JavaScript CoffeeScript Ruby Python PHP Perl
文字列クラスの3世代親のクラスを取得する(なければ null) Java Groovy Kotlin Scala Erlang Haskell PowerShell F# C# C++ Go Rust Dart TypeScript JavaScript CoffeeScript Ruby Python PHP Perl
オブジェクトの内容(メンバー変数の名前と値)を文字列で表す Java Groovy Kotlin Scala Erlang Haskell PowerShell F# C# C++ Go Rust Dart TypeScript JavaScript CoffeeScript Ruby Python PHP Perl
既存のクラスにメソッドを追加する Java Groovy Kotlin Scala Erlang Haskell PowerShell F# C# C++ Go Rust Dart TypeScript JavaScript CoffeeScript Ruby Python PHP Perl