IntelliJ IDEA签名如何更改

2018-11-02 18:01 更新

更改签名重构组合了几种可应用于方法签名的不同修改。您可以使用此重构实现以下目的:

  • 更改方法名称。
  • 更改方法返回类型。
  • 添加新参数并删除现有参数。
  • 将默认值分配给参数。
  • 重新排序参数。
  • 更改参数名称和类型。
  • 通过方法调用层次结构传播新参数。

当更改方法签名时,IntelliJ IDEA 会搜索该方法的所有使用实例,并更新所有调用、实现和重写可安全修改以反映更改的方法的替换。

注意:

  • Java、PHP、JavaScript 和 ActionScript 支持更改方法签名重构。
  • 您可以从 UML 类图访问此重构。
  • 该更改方法签名重构适用于构造函数。但是在这种情况下,不能更改名称和返回类型。

示例

更改签名之前的代码:

// 函数 paint() 在 IShape 接口中声明
public interface IShape {
function paint(g: Graphics): void;
}
// 然后在 Canvas 类的 paint() 函数中调用这个函数
public class Canvas {
private var shapes: Vector.<IShape>;
public function paint(g: Graphics): void {
for each (var shape: IShape in shapes) {
shape.paint(g);
}
}
}
// 现在, 我们将显示 IShape 接口的函数 paint () 的更改签名重构的示例

更改签名之后的代码:

// 在此重构示例中, 我们更改了现有参数的名称, 并引入了两个新参数。请注意, 第一个新参数是必需的参数, 而第二项是可选的, 因为它的默认值是在函数定义中指定的。

public interface IShape {
function paint(graphics:Graphics, wireframe:Boolean, offset:Point = null):void;
}

// 执行此重构时, 新参数被传播到 Canvas 类的 paint() 函数中。因此, Canvas.paint()的签名已更改。还要注意如何在 Canvas.paint() IShape.paint() 是怎么调用的。
public class Canvas {
private var shapes: Vector.<IShape>;

public function paint(g:Graphics, wireframe:Boolean): void {
for each (var shape: IShape in shapes) {
shape.paint(g, wireframe);
}
}
}
// 此重构的其他结果是可能的。有关详细信息, 请参阅下面的讨论。

以下的代码仅在安装并启用 Python Plugin 时有效:

# 此函数将被重命名:
def fibonacci( n ):
a, b = 0, 1
while b < n:
print( b )
a, b = b, a+b

n = int(input("n = "))
fibonacci( n )
# 使用新名称的函数:
def fibonacci_numbers( n ):
a, b = 0, 1
while b < n:
print( b )
a, b = b, a+b

n = int(input("n = "))
fibonacci_numbers( n )

以下的代码仅在安装并启用 Python Plugin 时有效:

# 将添加新参数:
def fibonacci( n ):
a, b = 0, 1
while b < n:
print( b )
a, b = b, a+b

n = int(input("n = ")
fibonacci( n )
# 函数的新参数,不要忘记指定参数的默认值, 它将用于函数调用。
def fibonacci( n,a,b ):
a, b = 0, 1 # this should be done manually!
while b < n:
print( b )
a, b = b, a+b

n = int(input("n = ")
fibonacci( n,0,1 )

初始化器、默认值和新参数的传播

对于添加到方法的每个新参数,您可以指定:

  • 用于初始化参数的值(或表达式)(IntelliJ IDEA 中的初始值设定项字段)。
  • 默认值(或表达式)( 默认值字段)。

您还可以将已引入的参数传播给调用其签名的函数的方法。

重构结果取决于是否指定默认值以及是否使用传播。

传播,可以将新参数传播到调用其签名所更改的方法的任何方法。在这种情况下,通常,调用方法的签名会相应地更改。 但是,这些更改也取决于初始值设定项和新参数的默认值集的组合。

初始化程序,在 "初始值设定项" 字段中指定的值将作为默认参数值添加到函数定义中。这将使相应参数成为可选参数。(有关必需和可选参数的讨论可以参考 Flex / ActionScript文档

如果未指定新参数的默认值(在默认值字段中),无论传播是否使用,方法调用和调用方法的签名都不会改变。

如果同时指定了初始化器和默认值,则重构结果取决于是否使用传播:

  • 如果不使用传播,初始化器值不影响函数调用和调用函数的签名。
  • 如果使用传播,则将初始化器值添加到调用函数的定义中作为相应参数的默认值(与您正在更改其签名的函数的方法相同)。

默认值,通常,这是要添加到方法调用中的值。

如果新参数不传播到调用方法,则此类方法中的调用也将使用此值。

如果使用传播,则此值不会影响调用方法中的方法调用。

更多重构实例

要了解上述不同的重构设置如何影响重构结果,请考虑以下示例。

所有示例都是前面显示的重构的简化版本。在所有情况下,会将 Boolean 类型的新参数 wireframe 添加到 IShape 接口中 定义的函数 paint() 。

在不同的示例中,使用初始化器和默认值的不同组合,并且将新参数传播到 Canvas.paint()(它调用 IShape.paint())。

实例-1:

当未初始化,默认值为 false 并且使用传播时,得到如下结果:

public interface IShape {
function paint(g:Graphics, wireframe:Boolean):void;
}
// Canvas 类中的 paint() 函数:
public function paint(g:Graphics, wireframe:Boolean): void
{
for each
(
var shape: IShape in shapes) {
shape.paint(g,wireframe);
}
}

实例-2:

当未初始化,默认值为 false 并且没有使用传播时,得到如下结果:

public interface IShape {
function paint(g:Graphics, wireframe:Boolean):void;
}
// Canvas 类中的 paint() 函数:
public function paint(g:Graphics): void
{
for each
(
var shape: IShape in shapes) {
shape.paint(g,false);
}
}

实例-3:

当初始化值为 true,默认值未设置并且使用传播时,得到如下结果:

public interface IShape {
function paint(g:Graphics, wireframe:Boolean = true):void;
}
// Canvas 类中的 paint() 函数:
public function paint(g:Graphics):
void
{
for each
(
var shape: IShape in shapes) {
shape.paint(g);
}
}

实例-4:

当初始化值为 true,无默认值并且没有使用传播时,得到如下结果:

public interface IShape {
function paint(g:Graphics, wireframe:Boolean = true):void;
}
// Canvas 类中的 paint() 函数:
public function paint(g:Graphics):void
{
for each
(
var shape: IShape in shapes) {
shape.paint(g);
}
}

实例-5:

当初始化值为 true,默认值为 false 并且使用传播时,得到如下结果:

public interface IShape {
function paint(g:Graphics, wireframe:Boolean = true):void;
}
// Canvas 类中的 paint() 函数:
public function paint(g:Graphics, wireframe:Boolean = true):
void {
for each
(
var shape: IShape in shapes) {
shape.paint(g,wireframe);
}
}

实例-6:

当初始化值为 true,默认值为 false 并且不使用传播时,得到如下结果:

public interface IShape {
function paint(g:Graphics,
wireframe:Boolean = true):void;
}
// Canvas 类中的 paint() 函数:
public function paint(g:Graphics):
void {
for each
(
var shape: IShape in shapes) {
shape.paint(g,false);
}
}

更改方法签名

  1. 在编辑器中,将光标放在要更改其签名的方法的名称中。
  2. 执行以下操作之一:
    • 按 Ctrl+F6。
    • 在主菜单上选择:重构|更改签名
    • 在上下文菜单上选择:重构| 更改签名。
  3. 在 "更改签名" 对话框中,对方法签名进行必要的更改,并指定需要哪些其他相关的更改。您可以:
    • 更改方法名称。要做到这一点,请在 "名称" 字段中编辑文本。
    • 通过编辑 "返回类型" 字段的内容来更改方法返回类型。只有在 PHP 语言7.1 和更高版本中才能设置方法返回类型。您可以在 php 页面上指定 php 语言级别(文件| 设置| 语言与框架| PHP (Windows 和 Linux 系统)或 IntelliJ IDEA | 首选项| 语言与框架| PHP(macOS系统))。
    • 使用表和 "参数" 区域中的按钮管理方法参数:
      • 要添加新参数,请单击 并指定相应表行中新参数的属性。添加参数时,可能需要将这些参数传播到调用当前方法的方法。在 PHP 上下文中,当从类的构造函数调用更改签名重构时,新参数可以初始化为一个类字段。要做到这一点,请使用 "创建和初始化类属性" 复选框:
        • 选中此复选框后,新添加的参数将作为字段初始化。IntelliJ IDEA 创建与该参数具有相同名称的受保护字段,并添加具有以下赋值的行:
          $this-><parameter_name> = {#content}lt;parameter_name>;
        • 清除该复选框后,将添加一个没有初始化的参数。
        例如,您具有以下构造函数:
        class ChangeSignatureNewParam {
            function __construct() {
                $a = "Constructor in ChangeSignatureNewParam";
                print $a;
            }
        }
        如果从 __construct () 方法调用更改签名重构并添加新的 $q 参数, 则结果将取决于是选中还是清除 "创建和初始化类属性" 复选框:
        • 选中 "创建和初始化类属性" 复选框:
          class ChangeSignatureNewParam {
              private $q;
              function __construct($q) {
                  $a = "Constructor in ChangeSignatureNewParam";
                  print $a;
                  $this->q = $q;
              }
          }
        • 清除 "创建和初始化类属性" 复选框:
          class ChangeSignatureNewParam {
              function __construct($q) {
                  $a = "Constructor in ChangeSignatureNewParam";
                  print $a;
              }
          }
      • 要删除参数,请单击相应行中的任何单元格,然后单击
      • 要重新排序参数,请使用 按钮。例如,如果要在列表中首先放置某个参数,请单击与该参数对应的行中的任何单元格,然后单击 所需的次数。
      • 要更改参数的名称、类型、初始化程序或参数的默认值,请在参数表中(分别在字段名称类型、初始化器和默认值)进行必要的编辑。
    • 沿调用当前方法的方法的层次结构传播新的方法参数(如果有)。
      (可能有方法调用您正在更改其签名的方法,这些方法反过来可能会被其他方法调用,等等,您可以通过以下方法将您所做的更改传播到当前方法的参数:调用方法的层次结构,并指定哪些调用方法应该受到影响,哪些不应该。)
      传播一个新参数的步骤:
      • 单击 "传播参数" 按钮
      • 在左边的窗格中选择“传播新参数的方法” 对话框,展开必要的节点,并选中要将新参数传播到的方法旁边的复选框。为了帮助您选择必要的方法,调用方法的代码和被调用的方法显示在对话框的右侧部分(分别在调用方法和被调用方法窗格中)。当您在左侧窗格中的方法之间切换时,右侧窗格中的代码会相应地更改。
      • 单击 "确定"。
  4. 要立即执行重构,请单击“重构”。若要在实际执行重构之前查看预期的更改并进行必要的调整,请单击 "预览"。

代码完成在 "参数" 区域的表的 "默认值" 字段中可用。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号