Рубрики
Без рубрики

Java (String) или .toString()?

Узнайте о различиях между приведением строк и выполнением метода toString() в Java.

Автор оригинала: baeldung.

1. введение

В этой статье мы дадим краткое объяснение различий между String приведением и выполнением toString () | метода . Мы кратко рассмотрим оба синтаксиса и рассмотрим пример, объясняющий цели использования каждого из них. Наконец, мы рассмотрим, какой из них является лучшим подходом.

2. Приведение типа строки и метод toString()

Давайте начнем с краткого резюме. Использование синтаксиса (String) строго связано с приведением типов в Java . Короче говоря, основной задачей использования этого синтаксиса является приведение исходной переменной в строку :

String str = (String) object;

Как мы знаем, каждый класс в Java является расширением, прямо или косвенно, класса Object , который реализует метод toString () . Мы используем его, чтобы получить строку представление любого объекта :

String str = object.toString();

Теперь, когда мы сделали краткий обзор, давайте рассмотрим несколько примеров, чтобы помочь понять, когда следует использовать каждый подход.

3. (String) vs toString()

Предположим, что у нас есть переменная Object , и мы хотим получить String . Какой синтаксис мы должны использовать?

Прежде чем двигаться дальше, мы должны подчеркнуть, что следующий метод полезности используется только для того, чтобы помочь объяснить нашу тему. На самом деле мы не стали бы использовать подобные утилитарные методы.

Во-первых, мы введем простой служебный метод приведения объекта в строку :

public static String castToString(Object object) {
    if (object instanceof String) {
        return (String) object;
    }
    return null;
}

Как мы видим, перед приведением мы должны проверить, что наша переменная object является экземпляром String . Если мы этого не сделаем, он может потерпеть неудачу и сгенерировать ClassCastException :

@Test(expected = ClassCastException.class)
public void givenIntegerObject_whenCastToObjectAndString_thenCastClassException() {
    Integer input = 1234;

    Object obj = input;
    String str = (String) obj;
}

Однако эта операция является null-безопасной. Использование его для неинвазивной переменной, даже если он ранее не применялся к переменной String , будет успешным:

@Test
public void givenNullInteger_whenCastToObjectAndString_thenSameAndNoException() {
    Integer input = null;

    Object obj = input;
    String str = (String) obj;

    assertEquals(obj, str);
    assertEquals(str, input);
    assertSame(input, str);
}

Теперь пришло время реализовать еще одну служебную функцию, вызывающую toString() для запрашиваемого объекта:

public static String getStringRepresentation(Object object) {
    if (object != null) {
        return object.toString();
    }
    return null;
}

В этом случае нам не нужно знать тип объекта, и он может быть успешно выполнен на объекте без типизации. Нам нужно только добавить простую проверку null . Если мы не добавим эту проверку, мы можем получить NullPointerException при передаче неинсталлированной переменной в метод:

@Test(expected = NullPointerException.class)
public void givenNullInteger_whenToString_thenNullPointerException() {
    Integer input = null;

    String str = input.toString();
}

Более того, из-за реализации core String выполнение метода toString() для переменной String возвращает тот же объект:

@Test
public void givenString_whenToString_thenSame() {
    String str = "baeldung";

    assertEquals("baeldung", str.toString());
    assertSame(str, str.toString());
}

Давайте вернемся к нашему вопросу – какой синтаксис мы должны использовать для нашей объектной переменной? Как мы видели выше, если мы знаем, что наша переменная является экземпляром String , мы должны использовать приведение типа :

@Test
public void givenString_whenCastToObject_thenCastToStringReturnsSame() {
    String input = "baeldung";
    
    Object obj = input;
    
    assertSame(input, StringCastUtils.castToString(obj));
}

Этот подход, как правило, более эффективен и быстр, потому что нам не нужно выполнять дополнительные вызовы функций. Но давайте вспомним, что мы никогда не должны передавать Строку как Объект . Это намекало бы на то, что у нас есть кодовый запах.

Когда мы передаем любой другой тип объекта, нам нужно вызвать метод toString() явно . Важно помнить, что он возвращает значение String в соответствии с реализацией:

@Test
public void givenIntegerNotNull_whenCastToObject_thenGetToStringReturnsString() {
    Integer input = 1234;

    Object obj = input;

    assertEquals("1234", StringCastUtils.getStringRepresentation(obj));
    assertNotSame("1234", StringCastUtils.getStringRepresentation(obj));
}

4. Заключение

В этом коротком уроке мы сравнили два подхода: приведение типа String и получение строкового представления с помощью метода toString () . На примерах мы объяснили различия и выяснили, когда следует использовать ( String) или toString() .

Как всегда, полный исходный код статьи доступен на GitHub .