В некоторых языках ООП стало довольно распространенным извлекать выгоду из лучшего из обоих миров:
Лучшее из объектов значащего типа< /strong> (в Java это будет @Value (Lombok) или, в последнее время, просто запись), чтобы избежать «примитивной одержимости» и передавать простые оболочки значений. Мы можем получить дополнительное преимущество, потенциально выполнив дополнительную проверку в их конструкторе, но основная возможность — это прямое сравнение значений двух разных объектов.
Лучшее из неявных преобразований типов (например, если ваш тип значения является оберткой вокруг целого числа, тогда вы все равно можете передать его везде, где ожидается целое число каким-либо уже написанным методом )
В настоящее время в C# пункта 2 легко достичь с помощью неявных и подобных методов. Но я не знаю, как это сделать в Java, поскольку нельзя наследовать пользовательские классы от собственных классов Integer или Long.
Пример:
// This is technically not an Integer, but a value type object (record)
public record PositiveInteger(Integer value) {
public PositiveInteger{
if (value < 0) {
throw new IllegalArgumentException();
}
}
}
...
// This expects an Integer. I should not be able to pass a PositiveInteger
public static printInteger(final Integer someInteger) {
print(someInteger.toString());
}
...
public static void main() {
Integer i = 1234;
printInteger(i);
PositiveInteger x = new PositiveInteger(6789);
printInteger(x); //
Подробнее здесь: [url]https://stackoverflow.com/questions/79054995/implicit-casts-in-java-passing-value-type-wrappers-to-methods-expecting-a-regul[/url]
В некоторых языках ООП стало довольно распространенным извлекать выгоду из лучшего из обоих миров: [list] [*][b]Лучшее из объектов значащего типа< /strong> (в Java это будет @Value (Lombok) или, в последнее время, просто запись), чтобы избежать «примитивной одержимости» и передавать простые оболочки значений. Мы можем получить дополнительное преимущество, потенциально выполнив дополнительную проверку в их конструкторе, но основная возможность — это прямое сравнение значений двух разных объектов. [*]Лучшее из неявных преобразований типов [/b] (например, если ваш тип значения является оберткой вокруг целого числа, [b]тогда вы все равно можете передать его везде, где ожидается целое число каким-либо уже написанным методом[/b] ) [/list] В настоящее время в C# пункта 2 легко достичь с помощью неявных и подобных методов. [b]Но я не знаю, как это сделать в Java[/b], поскольку нельзя наследовать пользовательские классы от собственных классов Integer или Long. Пример: [code]// This is technically not an Integer, but a value type object (record) public record PositiveInteger(Integer value) { public PositiveInteger{ if (value < 0) { throw new IllegalArgumentException(); } } }
...
// This expects an Integer. I should not be able to pass a PositiveInteger public static printInteger(final Integer someInteger) { print(someInteger.toString()); }
...
public static void main() { Integer i = 1234; printInteger(i);
PositiveInteger x = new PositiveInteger(6789); printInteger(x); //