1. 程式人生 > >坑爹的 Java 可變引數,把我整得夠慘。。

坑爹的 Java 可變引數,把我整得夠慘。。

最近在寫一個功能點,用了 Java 中的可變引數,真是把我搞得夠慘。。

什麼是可變引數?

就是方法引數用 Object... args 三個點形式,一個引數可以接收多個引數。

實際的程式碼就不帖了,來看這個示例吧:

示例1

public static void main(String[] args) {
    test("name=%s&memo=%s", "Java技術棧", "666");
}

private static void test(String text, Object... params) {
    String result = String.format(text, params);
    System.out.println(result);
}

大家猜結果是什麼?結果如我們想象:

name=Java技術棧&memo=666

示例2

public static void main(String[] args) {
    test("name=%s&memo=%s", "Java技術棧");
}

private static void test(String text, Object... params) {
    String result = String.format(text, params, "666");
    System.out.println(result);
}

我把 "666" 移到了子方法裡面,放到了 format 最後,再來看下結果是什麼。

name=[Ljava.lang.Object;@4cb2c100&memo=666

這並非是我想要的結果,把可變引數 params 陣列物件地址作為值輸出出來了,把我搞得夠慘,最後我幹掉了可變引數。。

JDK裡面很多有用到可變引數的,可實際開發中,並不建議使用可變參考,它帶來的困擾和潛在的問題會遠大於便利性,比如在方法重構、重寫等也會帶來很多問題。

關於可變引數,也是有開發規範的,不能隨便寫。我找到了阿里巴巴的《Java開發手冊》中關於可變引數的規約。

相同引數型別,相同業務含義,才可以使用 Java 的可變引數,避免使用 Object 。

說明:可變引數必須放置在引數列表的最後。 ( 提倡同學們儘量不用可變引數程式設計 )

正例: public List<User> listUsers(String type, Long... ids) {...}

獲取這份阿里巴巴的Java開發手冊最新PDF版,大家可以關注Java技術棧微信公眾號,在後臺回覆:手冊,即可獲取。

阿里巴巴也是不建議大家合作可變引數的,可知它帶來的坑會有多坑。。

另外,棧長已經整理了大量 Java 系列核心技術知識點文章,關注Java技術棧微信公眾號,在後臺回覆關鍵字:java,即可獲取最新版。

本文原創首發於微信公眾號:Java技術棧(id:javastack),轉載請原樣保留本資訊。

相關推薦

Java 可變引數

最近在寫一個功能點,用了 Java 中的可變引數,真是把我搞得夠慘。。 什麼是可變引數? 就是方法引數用 Object... ar

Python踩之為可變引數的函式如何動態傳遞多個引數進去

1、使用*(self.installAppPaths)搞定,一開始我就是想要動態傳遞多個 Tkinter.OptionMenu(self.root, self.box_variable, *(self.installAppPaths),command = self.box_list_clic

關於Go的可變引數的使用 踩的

package main import ( "log" ) func main() { print("nums is %d,%d,%d,%d,%d", 1, 2, 3, 4, 5) } func print(str stri

JAVA可變引數引數中有三個點

許多Java新人在看到下面的這段程式碼的時候,都會問一個問題:dealArray方法裡那三個小點點是什麼啊? [java] view plaincopyprint? publicclass TestVarArgus {       publicstatic

每天10道Java面試題offer有!

1.簡述JDK、JRE、JVM? 一、JDK JDK(Java Development Kit) 是整個JAVA的核心, 包括了Java執行環境(Java Runtime Envirnment), 一堆Java工具(javac/java/jdb等)和Java基礎的類庫(即Java API 包括rt.jar

使用可變引數實現函式求函式引數的平均值

使用可變引數,實現函式,求函式引數的平均值 程式程式碼如下: #include <stdio.h> #include <stdarg.h> int Average(int n, ...) { va_list arg;

java實現:2018年9月9日晚上的京東筆試題:現給出n個物品的a,b,c引數請你求出不合格品的數量

題目: 現有n個物品,每個物品有三個引數,ai,bi,ci,定義i物品不合格的依據是:若存在物品j,且aj>ai,bj>bi,cj>ci,則稱i物品為不合格品。 現給出n個物品的a,b,c引數,請你求出不合格品的數量。 輸入: 第一行包含一個整數n(1<=n&

java 可變引數,集合與陣列的互轉,靜態匯入

可變引數 可變引數是如果型別確定,引數個數不確定,需要用可變引數來定義,引數的具體個數在方法呼叫時才能確定java把可變引數當做陣列處理 可變引數的定義是jdk1.5加入的,比如main方法 public static void main(String [] args) 特點:

Java可變引數的使用

Java相關知識 基本資料型別(八個):byte , short , int , long , float,double,boolean,char, 基本資料型別 .length() 不是基本資料型別 .length 可變引數的使用 public

Java可變引數型別與陣列的區別聯絡

Java方法中的可變引數型別是一個非常重要的概念,有著非常廣泛的應用,本文對此加以分析。如下:  public class TestVarArgus { public static void dealArray(int... intArray) { }

使用python搶購低價魅族手機的Python指令碼別入~

還記得10月份新出的,魅族16嗎? 小編帶你再搶一次。 使用python搶購魅族手機,坑爹的Python指令碼,別入坑~ 無意間瀏覽到魅族官網,說魅族16ph限量100臺。10月30號中午12點搶購。正好我爪機目前處於報廢狀態,就來一試手氣了。11點多種,習慣性的看了下網頁尾本,發現了檢測是否到搶購時間,並

使用python搶購魅族手機的Python指令碼別入~

還記得10月份新出的,魅族16嗎? 小編帶你再搶一次。 使用python搶購魅族手機,坑爹的Python指令碼,別入坑~ 無意間瀏覽到魅族官網,說魅族16ph限量100臺。10月30號中午12點搶購。正好我爪機目前處於報廢狀態,就來一試手氣了。11點多種,習慣性的看了下網頁尾本,發現了檢測

python中的函式以及函式的可變引數遞迴函式和高階函式以及練習題目

函式作用:實現程式碼的複用 函式概念:函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。 函式能提高應用的模組性,和程式碼的重複利用率。你已經知道Python提供了許多內建函式,比如print()。但你也可以自己建立函式,這被叫做使用者自定義函式。 系統的幾

Java開發八年來總結的知識腦圖以及的進階線路規劃

學習一個新的技術時,其實不在於跟著某個教程敲出了幾行、幾百行程式碼,這樣你最多隻能知其然而不知其所以然,進步緩慢且深度有限,最重要的是一開始就對整個學習路線有巨集觀、簡潔的認識,確定大的學習方向,這樣才能事半功倍。 我們經常會遇到這樣的情況:一開始學習一門新技術的時候,面對

Java可變引數應用實操

有時候會對某個函式的入參無法確定輸入個數,這個時候就需要使用可變引數,先來看看是如何使用的。 public class Test { /** * @param args */ public static void main(String[

深度解析Java可變引數型別以及與陣列的區別

這篇文章主要介紹了Java方法的可變引數型別,通過例項對Java中的可變引數型別進行了較為深入的分析,需要的朋友可以參考下。 Java方法中的可變引數型別是一個非常重要的概念,有著非常廣泛的應用。本文就以例項形式對此加以分析。具體如下: 一般來說,許多Java初學者在

Java可變引數個數方法

/* *JDK5.0新特性:可變個數形式引數 * * 1.可匹配0至多個引數 * 2.可與其他同名方法構成過載 * 3.與陣列的使用方法一直,只是多了“沒有引數” * 4.若要加入其它型別

java可變引數總結

今天總結一下java中可變引數這個知識點。還是來看一個例子,現在我想寫個方法來計算兩個整形的和並且輸出,這個方法很簡單: public class KeBian { public static void main(String[] args) {

C/C++可變引數“## __VA_ARGS__”巨集的介紹和使用

轉自:http://www.linuxidc.com/Linux/2014-06/102923.htm 在閱讀程式碼的時候,在一個巨集定義語句中,發現了個之前未曾見過的編譯器預定義巨集:“__VA_ARGS__”。當時,從程式碼語句中推測它代表巨集引數:“…”(本文稱之為省略號),依

Java:可變引數列表

知識總結: package imooc.method; public class ArgsDemo { //求和 public void sum(int...n){ int sum=0