IntelliJ 可以自动创建装饰器类吗?
Posted
技术标签:
【中文标题】IntelliJ 可以自动创建装饰器类吗?【英文标题】:Can IntelliJ automatically create a decorator class? 【发布时间】:2011-05-18 13:31:13 【问题描述】:有时,我会像这样创建一个装饰器类:
class MyInterfaceDecorator implements MyInterface
private final MyInterface delegate;
... constructor taking a MyInterface instance ...
@Override
public Object someInterfaceMethod(Some argument)
return delegate.someInterfaceMethod(argument);
... etc, more methods here...
IntelliJ 可以自动为我创建这个类吗?
【问题讨论】:
【参考方案1】:更新//
我注意到 IntelliJ 有一个用于生成委托方法的“生成”选项。创建一个新类:
public class MyDecoratorClass
private MyInterfaceWithManyMethods myInterface;
然后标记 myInterface,转到 Menu > Code > Delegate Methods,选择所有要包装的方法,就是这样。
//更新结束
您可以尝试“重构”->“用委托替换继承”重构。它应该能够做到这一点,就像这样。我称之为“使用 Alt+Enter 的代码”
转到要为其生成装饰器的界面。
public interface MyInterfaceWithManyMethods
void method1();
void method2();
void method3();
按 Alt+Enter,选择“Implement Interface”,为您的装饰器命名,如“MyDecorator”。这给了你
public class MyDecorator implements MyInterfaceWithManyMethods
public void method1()
public void method2()
public void method3()
在新类中,选择类名,然后“重构”->“用委托替换继承”,选择你的接口,勾选所有方法名,回车。你会得到:
public class MyDecorator
private final MyObject object = new MyObject();
public void method1()
object.method1();
public void method2()
object.method2();
public void method3()
object.method3();
private class MyObject implements MyInterfaceWithManyMethods
public void method1()
public void method2()
public void method3()
手动删除内部类和对象初始化器。你得到:
public class MyDecorator
public void method1()
object.method1();
public void method2()
object.method2();
public void method3()
object.method3();
在现在标记为红色的“对象”上按 Alt+Enter,选择“创建字段”,选择 MyInterfaceWithManyMethods。
public class MyDecorator
private MyInterfaceWithManyMethods object;
public void method1()
object.method1();
public void method2()
object.method2();
public void method3()
object.method3();
选择对象变量,按Alt+Enter,选择“添加构造函数参数”:
public class MyDecorator
private MyInterfaceWithManyMethods object;
public MyDecorator(MyInterfaceWithManyMethods object)
this.object = object;
public void method1()
object.method1();
public void method2()
object.method2();
public void method3()
object.method3();
您会发现,只需按几下 Alt+Enter 即可完成所有操作。读起来像很多工作,但它可以在不到 20 秒的时间内完成。如果您只有 2 或 3 个方法,则使用实时模板可能会更快,但是如果您有许多具有复杂签名的方法,使用此方法您将在大约 20 秒内获得工作结果。 Alt+Enter 很简单:D
【讨论】:
我不知道当你想从头开始创建一个类时它是如何工作的 我为你添加了完整的描述。 感谢 +1 的完整答案:)。我写了一个文件模板,因为当模板创建时,你只需要创建文件,然后只有一个“Alt+Inser”。创建时间应该与您的解决方案几乎相同,但键盘操作更少。 从至少 Intellij 8 开始生成代表。【参考方案2】:您也许可以添加一个文件模板,例如:
class $NAME implements $INTERFACE
private final $INTERFACE delegate;
public $NAME(final $INTERFACE delegate)
this.delegate = delegate;
然后当您使用此模板创建文件时,只需使用 Alt+Inser 和选择委托方法。 它并不完美,但这可能是一个捷径
【讨论】:
不错,但如果它还可以生成要实现的方法(委托对委托对象的调用),那就太好了。以上是关于IntelliJ 可以自动创建装饰器类吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 python memoization 装饰器类中设置 get/set 属性