LINUX.ORG.RU

А в каких языках, желательно jvm based есть такая штука из коробки?


0

2

Автоматическое заполнение полей класса потомка, когда есть инстанс класса предка?

Т.е, например:

public class UserInfo {
  //some fields
}

public class ExtendedUserInfo extends UserInfo {
  //some other fields
}

public class UserDao {
  public UserInfo getUserInfo(Long id) {
    //some code
  }
}

public class MyController {
  public ExtendedUserInfo getExtendedInfo(Long userId) {
    UserInfo info = userDao.getUserInfo(userId);
    // И вот как теперь создать инстанс ExtendedUserInfo, не занимаясь ручным присвоением полей и не пиша ручками конструкторов копирования?
  }
}

Собственно в яве - никак, разве что использовать различные beanutils, reflection utils итд. А есть ли языки где такое возможно из коробки? И если нет, то почему?

★★★★

Как это иронично ни звучит, такой язык X есть, но я его называть не буду, поскольку каждая вшивая собака на ЛОРе вспоминает его почти в каждом треде, если, конечно, я правильно понял твою задачу.

Только придется поколдовать с копирование старого объекта в новый (скопипастить строк десять из StackOverflow), а затем просто сказать: поменяй мне класс, которому объект будет принадлежать. Тут только возникают неясности (для меня) с тем, как будут инициализироваться новые слоты (поля) - вероятно, ограничится просто перекрытием shared-initialize (я еще так не делал). Разумеется, это - плохой стиль, и как бы сказал один местный товарищ: «на X так не пишут», но такова была задача.

dave ★★★★★
()

javascript что-ли?
в jdk8 вроде хотят сделать компилятор javascript

anonymous
()
Ответ на: комментарий от dave

такой язык X есть, но я его называть не буду

Боишься, скобчатый, что опять озалупим?

anonymous
()
Ответ на: комментарий от kovrik

Попробую объяснить еще раз. Есть два класса, родитель и потомок. Есть инстанс класса родителя, а надо создать инстанс потомка с полями, заполненными данными из имеющегося инстанса. Вопрос в том - есть ли язык, в котором данный кейс сделан красиво из коробки?

Nagwal ★★★★
() автор топика

Это не жаба-стайл. Тебе нужно выделить нужные поля в отдельный класс и в зависимости от ситуации либо наследовать оттуда (если твои поля не private), либо включить этот класс с другой как один field. Другие предлагаемые способы слишком ужасны для использования.

auto12884839
()
Ответ на: комментарий от Nagwal

Есть инстанс класса родителя, а надо создать инстанс потомка с полями, заполненными данными из имеющегося инстанса. Вопрос в том - есть ли язык, в котором данный кейс сделан красиво из коробки?

Common Lisp, конечно. Метод change-class.

anonymous
()
Ответ на: комментарий от anonymous

Хотелось бы что-то static typed.

Nagwal ★★★★
() автор топика

Может вы можете пересмотреть метод getUserInfo(userId), позволяющий передавать фабрику/билдер?

vertexua ★★★★★
()
public class UserDao {
  public UserInfo getUserInfo(Long id) {
    return getUserInfo(id, new UserInfo());
  }

  protected UserInfo getUserInfo(Long id, UserInfo info) {
    //some code
    return info;
  }
}

public class MyController {
  public ExtendedUserInfo getExtendedInfo(Long userId) {
    ExtendedInfo extendedInfo = userDao.getUserInfo(userId, new ExtendedInfo());
  }
}
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.