Реализация и преобразование встроенных объектов в Java - PullRequest
18 голосов
/ 07 января 2012

Я пришел на Java из Visual Basic и, кажется, думаю, что во многом был испорчен: p

Есть ли способ создать экземпляр объекта и изменить его встроенным? Что-то вроде:

JFrame aFrame = new JFrame();   
aFrame.add(new JPanel() {.setSize(100,100) .setLocation(50,50) .setBackground(Color.red) });

Я смог @Override методов, но ищу что-то попроще. У меня много поисков, но если для этого типа встроенного экземпляра есть конкретный термин, он ускользает от меня.

Спасибо за ваше время!

Ответы [ 2 ]

30 голосов
/ 07 января 2012

Да, но некоторые люди считают это хакерским.

JFrame aFrame = new JFrame();
aFrame.add(new JPanel() {{
 setSize(100,100);
 setLocation(50,50);
 setBackground(Color.red);
}});

По сути, вы добавляете еще один слой {} (блок инициализации экземпляра), который выполняется при создании экземпляра панели.поэтому вы можете поместить в него любой код.(как вызывающие сеттеры).

9 голосов
/ 07 января 2012

Хороший трюк представлен в ответе @ ClickerMonkey.Однако, если класс поддерживает цепочку методов, вы можете использовать подобный синтаксис без "хака" инициализатора:

new ChainClass().setSize(100,100) .setLocation(50,50) .setBackground(Color.red)

Недостатком является то, что ChainClass должен выглядеть примерно так:

public class ChainClass  {
  public ChainClass setSize(int w, int h)  {
     // ...
     return this;
  }

  public ChainClass setLocation(int x, int y)  {
    // ...
    return this;
  }

  // etc.
}

К сожалению, это не относится к большинству стандартных классов Java.Вы можете реализовать это для своих классов.

...