Opening the in-game chat always causes Minecraft to freeze (the window remains open, but it may have crashed). I cannot move, hear, or do anything in Minecraft Bedrock Edition. The only way to escape from this is to press Alt+Tab or force-quit my computer.
public class Person {
private String name;
private int age;
// (略)コンストラクタ
// (略)getterとsetter
// setter以外にもプロパティを書き換えるメソッドは書ける
}
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
System.out.println(person.getName());
}
}
public record Person(String name, int age) { }
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
System.out.println(person.name());
}
}
public class Person {
private String name;
private int age;
// (略)コンストラクタ, getter, setter
public String generateGreet() {
return "こんにちは、" + this.name + "といいます。";
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
System.out.println(person.generateGreet());
// こんにちは、Aliceといいます。
}
}
このクラスについてよく知らない人がこのクラスの generateGreetMessage() のテストコードを書いたとします。このとき、その人はテストで generateGreetMessage() を実行したことで name や age が書き換わる可能性を意識すべき余地は残ります。
public class PersonTest {
@Test
public void testIsSenior() {
Person person = new Person("Alice", 70);
assertEquals("こんにちは、Aliceといいます。", person.generateGreet());
// ↑この実行で person.name や person.age
// が書き換わる余地は文法上残されている。
// personのメソッドの動作がgenerateGreetを実行したことで
// 変わるかもしれないことを意識する必要が出てくる
}
}
public record Person(String name, int age) { }
public class PersonService {
// ビジネスロジックはPersonから独立した関数やサービスとして実装
public static String generateGreet(Person person) {
return "こんにちは、" + person.name() + "といいます。";
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
System.out.println(PersonService.generateGreet(person));
// こんにちは、Aliceといいます。
}
}
Personはどれほど参照されようと中身の name や age は変化しません。単なるパラメータとして渡すだけで良くなり、期待される出力を確認することだけに意識を集中してテストケースを作成できます。
public class PersonServiceTest {
@Test
public void testIsSenior() {
Person person = new Person("Alice", 70);
assertEquals("こんにちは、Aliceといいます。", PersonService.generateGreet(person));
// ↑この実行でpersonの中身が書き換わることを恐れなくて良い。
// personに再代入が無い限り、
// PersonService.generateGreet(person) はいつも同じ結果を返す
}
}
or が返すのは or の両端の値のどちらかです。どちらが返されるかは、その両端の値がTrueとFalseどちらに評価されるかによって決まります。
Pythonの or はJavaなどの言語と異なり、真偽値(True, False)しか受け取れない演算子ではありません。あらゆる値をオペランドに(つまりorの両側に)持つことができます。
つまり先に登場したif文は厳密に言うと下記の流れをたどっているということです。
x = 10
if x == 10 or x == 20:
# ↓
# if True or False: # or の両端の式がまず計算される
# ↓
# if True: # orの左側の値がTrue。よってorは左側の値のTrueを返す
print("xは10か20です")
# 実行結果: xは10か20です
両方ともFalseとなる場合は下記のとおりです。
x = 100000
if x == 10 or x == 20:
# ↓
# if False or False: # or の両端の式がまず計算される
# ↓
# if False: # orの両端がFalse。よってorは右側のFalseを返す
print("xは10か20です")
# 実行結果: (何も出力されない)
どう役立つのか
関数の引数のデフォルト値
関数の引数に偽と評価される値 (None0"" など)が渡された場合のデフォルト値を設定できます。
def greet(name=None):
name = name or "Guest"
print(f"Hello, {name}!")
greet() # 出力: Hello, Guest!
greet("Alice") # 出力: Hello, Alice!