IntelliJ IDEA簽名如何更改

2018-11-02 18:01 更新

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

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

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

注意:

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

示例

更改簽名之前的代碼:

// 函數(shù) paint() 在 IShape 接口中聲明
public interface IShape {
function paint(g: Graphics): void;
}
// 然后在 Canvas 類的 paint() 函數(shù)中調用這個函數(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 () 的更改簽名重構的示例

更改簽名之后的代碼:

// 在此重構示例中, 我們更改了現(xiàn)有參數(shù)的名稱, 并引入了兩個新參數(shù)。請注意, 第一個新參數(shù)是必需的參數(shù), 而第二項是可選的, 因為它的默認值是在函數(shù)定義中指定的。

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

// 執(zhí)行此重構時, 新參數(shù)被傳播到 Canvas 類的 paint() 函數(shù)中。因此, 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 時有效:

# 此函數(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ù):
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ù)的默認值, 它將用于函數(shù)調用。
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 )

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

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

  • 用于初始化參數(shù)的值(或表達式)(IntelliJ IDEA 中的初始值設定項字段)。
  • 默認值(或表達式)( 默認值字段)。

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

重構結果取決于是否指定默認值以及是否使用傳播。

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

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

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

如果同時指定了初始化器和默認值,則重構結果取決于是否使用傳播:

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

默認值,通常,這是要添加到方法調用中的值。

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

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

更多重構實例

要了解上述不同的重構設置如何影響重構結果,請考慮以下示例。

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

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

實例-1:

當未初始化,默認值為 false 并且使用傳播時,得到如下結果:

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);
}
}

實例-2:

當未初始化,默認值為 false 并且沒有使用傳播時,得到如下結果:

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);
}
}

實例-3:

當初始化值為 true,默認值未設置并且使用傳播時,得到如下結果:

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);
}
}

實例-4:

當初始化值為 true,無默認值并且沒有使用傳播時,得到如下結果:

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);
}
}

實例-5:

當初始化值為 true,默認值為 false 并且使用傳播時,得到如下結果:

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);
}
}

實例-6:

當初始化值為 true,默認值為 false 并且不使用傳播時,得到如下結果:

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

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

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號