IntelliJ IDEA簽名如何更改

2018-11-02 18:01 更新

更改簽名重構(gòu)組合了幾種可應(yīng)用于方法簽名的不同修改。您可以使用此重構(gòu)實(shí)現(xiàn)以下目的:

  • 更改方法名稱。
  • 更改方法返回類型。
  • 添加新參數(shù)并刪除現(xiàn)有參數(shù)。
  • 將默認(rèn)值分配給參數(shù)。
  • 重新排序參數(shù)。
  • 更改參數(shù)名稱和類型。
  • 通過方法調(diào)用層次結(jié)構(gòu)傳播新參數(shù)。

當(dāng)更改方法簽名時(shí),IntelliJ IDEA 會搜索該方法的所有使用實(shí)例,并更新所有調(diào)用、實(shí)現(xiàn)和重寫可安全修改以反映更改的方法的替換。

注意:

  • Java、PHP、JavaScript 和 ActionScript 支持更改方法簽名重構(gòu)。
  • 您可以從 UML 類圖訪問此重構(gòu)。
  • 該更改方法簽名重構(gòu)適用于構(gòu)造函數(shù)。但是在這種情況下,不能更改名稱和返回類型。

示例

更改簽名之前的代碼:

// 函數(shù) paint() 在 IShape 接口中聲明
public interface IShape {
function paint(g: Graphics): void;
}
// 然后在 Canvas 類的 paint() 函數(shù)中調(diào)用這個(gè)函數(shù)
public class Canvas {
private var shapes: Vector.<IShape>;
public function paint(g: Graphics): void {
for each (var shape: IShape in shapes) {
shape.paint(g);
}
}
}
// 現(xiàn)在, 我們將顯示 IShape 接口的函數(shù) paint () 的更改簽名重構(gòu)的示例

更改簽名之后的代碼:

// 在此重構(gòu)示例中, 我們更改了現(xiàn)有參數(shù)的名稱, 并引入了兩個(gè)新參數(shù)。請注意, 第一個(gè)新參數(shù)是必需的參數(shù), 而第二項(xiàng)是可選的, 因?yàn)樗哪J(rèn)值是在函數(shù)定義中指定的。

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

// 執(zhí)行此重構(gòu)時(shí), 新參數(shù)被傳播到 Canvas 類的 paint() 函數(shù)中。因此, Canvas.paint()的簽名已更改。還要注意如何在 Canvas.paint() IShape.paint() 是怎么調(diào)用的。
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);
}
}
}
// 此重構(gòu)的其他結(jié)果是可能的。有關(guān)詳細(xì)信息, 請參閱下面的討論。

以下的代碼僅在安裝并啟用 Python Plugin 時(shí)有效:

# 此函數(shù)將被重命名:
def fibonacci( n ):
a, b = 0, 1
while b < n:
print( b )
a, b = b, a+b

n = int(input("n = "))
fibonacci( n )
# 使用新名稱的函數(shù):
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 時(shí)有效:

# 將添加新參數(shù):
def fibonacci( n ):
a, b = 0, 1
while b < n:
print( b )
a, b = b, a+b

n = int(input("n = ")
fibonacci( n )
# 函數(shù)的新參數(shù),不要忘記指定參數(shù)的默認(rèn)值, 它將用于函數(shù)調(diào)用。
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 )

初始化器、默認(rèn)值和新參數(shù)的傳播

對于添加到方法的每個(gè)新參數(shù),您可以指定:

  • 用于初始化參數(shù)的值(或表達(dá)式)(IntelliJ IDEA 中的初始值設(shè)定項(xiàng)字段)。
  • 默認(rèn)值(或表達(dá)式)( 默認(rèn)值字段)。

您還可以將已引入的參數(shù)傳播給調(diào)用其簽名的函數(shù)的方法。

重構(gòu)結(jié)果取決于是否指定默認(rèn)值以及是否使用傳播。

傳播,可以將新參數(shù)傳播到調(diào)用其簽名所更改的方法的任何方法。在這種情況下,通常,調(diào)用方法的簽名會相應(yīng)地更改。 但是,這些更改也取決于初始值設(shè)定項(xiàng)和新參數(shù)的默認(rèn)值集的組合。

初始化程序,在 "初始值設(shè)定項(xiàng)" 字段中指定的值將作為默認(rèn)參數(shù)值添加到函數(shù)定義中。這將使相應(yīng)參數(shù)成為可選參數(shù)。(有關(guān)必需和可選參數(shù)的討論可以參考 Flex / ActionScript文檔

如果未指定新參數(shù)的默認(rèn)值(在默認(rèn)值字段中),無論傳播是否使用,方法調(diào)用和調(diào)用方法的簽名都不會改變。

如果同時(shí)指定了初始化器和默認(rèn)值,則重構(gòu)結(jié)果取決于是否使用傳播:

  • 如果不使用傳播,初始化器值不影響函數(shù)調(diào)用和調(diào)用函數(shù)的簽名。
  • 如果使用傳播,則將初始化器值添加到調(diào)用函數(shù)的定義中作為相應(yīng)參數(shù)的默認(rèn)值(與您正在更改其簽名的函數(shù)的方法相同)。

默認(rèn)值,通常,這是要添加到方法調(diào)用中的值。

如果新參數(shù)不傳播到調(diào)用方法,則此類方法中的調(diào)用也將使用此值。

如果使用傳播,則此值不會影響調(diào)用方法中的方法調(diào)用。

更多重構(gòu)實(shí)例

要了解上述不同的重構(gòu)設(shè)置如何影響重構(gòu)結(jié)果,請考慮以下示例。

所有示例都是前面顯示的重構(gòu)的簡化版本。在所有情況下,會將 Boolean 類型的新參數(shù) wireframe 添加到 IShape 接口中 定義的函數(shù) paint() 。

在不同的示例中,使用初始化器和默認(rèn)值的不同組合,并且將新參數(shù)傳播到 Canvas.paint()(它調(diào)用 IShape.paint())。

實(shí)例-1:

當(dāng)未初始化,默認(rèn)值為 false 并且使用傳播時(shí),得到如下結(jié)果:

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

實(shí)例-2:

當(dāng)未初始化,默認(rèn)值為 false 并且沒有使用傳播時(shí),得到如下結(jié)果:

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

實(shí)例-3:

當(dāng)初始化值為 true,默認(rèn)值未設(shè)置并且使用傳播時(shí),得到如下結(jié)果:

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

實(shí)例-4:

當(dāng)初始化值為 true,無默認(rèn)值并且沒有使用傳播時(shí),得到如下結(jié)果:

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

實(shí)例-5:

當(dāng)初始化值為 true,默認(rèn)值為 false 并且使用傳播時(shí),得到如下結(jié)果:

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

實(shí)例-6:

當(dāng)初始化值為 true,默認(rèn)值為 false 并且不使用傳播時(shí),得到如下結(jié)果:

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

更改方法簽名

  1. 在編輯器中,將光標(biāo)放在要更改其簽名的方法的名稱中。
  2. 執(zhí)行以下操作之一:
    • 按 Ctrl+F6。
    • 在主菜單上選擇:重構(gòu)|更改簽名
    • 在上下文菜單上選擇:重構(gòu)| 更改簽名。
  3. 在 "更改簽名" 對話框中,對方法簽名進(jìn)行必要的更改,并指定需要哪些其他相關(guān)的更改。您可以:
    • 更改方法名稱。要做到這一點(diǎn),請?jiān)?"名稱" 字段中編輯文本。
    • 通過編輯 "返回類型" 字段的內(nèi)容來更改方法返回類型。只有在 PHP 語言7.1 和更高版本中才能設(shè)置方法返回類型。您可以在 php 頁面上指定 php 語言級別(文件| 設(shè)置| 語言與框架| PHP (Windows 和 Linux 系統(tǒng))或 IntelliJ IDEA | 首選項(xiàng)| 語言與框架| PHP(macOS系統(tǒng)))。
    • 使用表和 "參數(shù)" 區(qū)域中的按鈕管理方法參數(shù):
      • 要添加新參數(shù),請單擊 并指定相應(yīng)表行中新參數(shù)的屬性。添加參數(shù)時(shí),可能需要將這些參數(shù)傳播到調(diào)用當(dāng)前方法的方法。在 PHP 上下文中,當(dāng)從類的構(gòu)造函數(shù)調(diào)用更改簽名重構(gòu)時(shí),新參數(shù)可以初始化為一個(gè)類字段。要做到這一點(diǎn),請使用 "創(chuàng)建和初始化類屬性" 復(fù)選框:
        • 選中此復(fù)選框后,新添加的參數(shù)將作為字段初始化。IntelliJ IDEA 創(chuàng)建與該參數(shù)具有相同名稱的受保護(hù)字段,并添加具有以下賦值的行:
          $this-><parameter_name> = {#content}lt;parameter_name>;
        • 清除該復(fù)選框后,將添加一個(gè)沒有初始化的參數(shù)。
        例如,您具有以下構(gòu)造函數(shù):
        class ChangeSignatureNewParam {
            function __construct() {
                $a = "Constructor in ChangeSignatureNewParam";
                print $a;
            }
        }
        如果從 __construct () 方法調(diào)用更改簽名重構(gòu)并添加新的 $q 參數(shù), 則結(jié)果將取決于是選中還是清除 "創(chuàng)建和初始化類屬性" 復(fù)選框:
        • 選中 "創(chuàng)建和初始化類屬性" 復(fù)選框:
          class ChangeSignatureNewParam {
              private $q;
              function __construct($q) {
                  $a = "Constructor in ChangeSignatureNewParam";
                  print $a;
                  $this->q = $q;
              }
          }
        • 清除 "創(chuàng)建和初始化類屬性" 復(fù)選框:
          class ChangeSignatureNewParam {
              function __construct($q) {
                  $a = "Constructor in ChangeSignatureNewParam";
                  print $a;
              }
          }
      • 要?jiǎng)h除參數(shù),請單擊相應(yīng)行中的任何單元格,然后單擊 。
      • 要重新排序參數(shù),請使用 按鈕。例如,如果要在列表中首先放置某個(gè)參數(shù),請單擊與該參數(shù)對應(yīng)的行中的任何單元格,然后單擊 所需的次數(shù)。
      • 要更改參數(shù)的名稱、類型、初始化程序或參數(shù)的默認(rèn)值,請?jiān)趨?shù)表中(分別在字段名稱類型、初始化器和默認(rèn)值)進(jìn)行必要的編輯。
    • 沿調(diào)用當(dāng)前方法的方法的層次結(jié)構(gòu)傳播新的方法參數(shù)(如果有)。
      (可能有方法調(diào)用您正在更改其簽名的方法,這些方法反過來可能會被其他方法調(diào)用,等等,您可以通過以下方法將您所做的更改傳播到當(dāng)前方法的參數(shù):調(diào)用方法的層次結(jié)構(gòu),并指定哪些調(diào)用方法應(yīng)該受到影響,哪些不應(yīng)該。)
      傳播一個(gè)新參數(shù)的步驟:
      • 單擊 "傳播參數(shù)" 按鈕 。
      • 在左邊的窗格中選擇“傳播新參數(shù)的方法” 對話框,展開必要的節(jié)點(diǎn),并選中要將新參數(shù)傳播到的方法旁邊的復(fù)選框。為了幫助您選擇必要的方法,調(diào)用方法的代碼和被調(diào)用的方法顯示在對話框的右側(cè)部分(分別在調(diào)用方法和被調(diào)用方法窗格中)。當(dāng)您在左側(cè)窗格中的方法之間切換時(shí),右側(cè)窗格中的代碼會相應(yīng)地更改。
      • 單擊 "確定"。
  4. 要立即執(zhí)行重構(gòu),請單擊“重構(gòu)”。若要在實(shí)際執(zhí)行重構(gòu)之前查看預(yù)期的更改并進(jìn)行必要的調(diào)整,請單擊 "預(yù)覽"。

代碼完成在 "參數(shù)" 區(qū)域的表的 "默認(rèn)值" 字段中可用。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號