Как переопределить toString () внутри класса оболочки?

1

Мне показали способ проанализировать некоторые данные из базы данных для объекта. Мне дали этот хороший класс обертки

public class ObjectWrapper implements Wrapper{
   private Object wrappedObject;
//...
public static Wrapper wrap(ResultSet rs, int column, int columnType) throws SQLException {        
        if (columnType == 0) {
            return new EmptyListExceptionWrapper();
        } else {
            return new ObjectWrapper(rs.getObject(column));
        }
    }
}

Когда я пытаюсь использовать его для анализа этих объектов, я получаю имена вроде databaseConnection.ObjectWrapper@5010be6 а не так, как они есть на самом деле. Другой хороший парень сказал мне, что я должен переопределить метод toString() внутри класса ObjectWrapper, чтобы получить реальные результаты.

Как я должен это сделать? Я знаю, что эти примитивные типы не могут быть добавлены или изменены. Например, я должен сделать что-то подобное ниже?

 public static String toString(){
     String str = new String();
     return str += wrappedObject;
 }
  • 0
    что вы подразумеваете под РЕАЛЬНЫМ результатом?
  • 0
    Я имею в виду настоящие имена. Например, вместо databaseConnection.ObjectWrapper@5010be6 , ΔΕ01.1
Теги:
override
wrapper
tostring
wrapping

2 ответа

4
Лучший ответ

Во-первых, методы, применяемые к определенному экземпляру вашего класса, не должны быть static, и вам следует избегать объединения строк в пользу StringBuilder.

Во-вторых, ряд инструментов создадут для вас полезные методы toString: ваша среда IDE может генерировать одну, а Apache Commons Lang имеет ToStringBuilder.

Если у вас нет информации об завернутом типе (и его собственной реализации toString), вы можете просто использовать что-то вроде этого:

@Override
public String toString() {
    // uses a StringBuilder implicitly
    return "ObjectWrapper[" + wrappedObject.toString() + "]";
}
  • 0
    Обратите внимание, что вы можете (и должны) просто использовать wrappedObject вместо wrappedObject.toString() .
  • 0
    @ ChrisJester-Young это работает сейчас! И я понял, что происходит. Большое спасибо.
Показать ещё 1 комментарий
1

Object.toString(), который вы вызываете в

str += wrappedObject;

по умолчанию вернет хэш-код объекта. Вам нужно бросить wrappedObject в то, что вы можете затем распечатать свойства

class objectDef{
    private int x;
    public int y;
    public int getX() { return x; }
}

//ToString method
public String toString()
{
    return "ObjectWrapper has Y: " + ((objectDef)wrappedObject).y) + " x: " + ((objectDef)wrappedObject).getX() ".";
}
  • 1
    По умолчанию toString не использует адрес памяти объекта (который, кстати, является подвижным и, следовательно, недоступным для кода Java); он использует хеш-код объекта.
  • 0
    Я буду иметь это в виду, большое спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню