java:类似C的选项参数

时间:2014-03-14 14:07:14

标签: java constants optional-parameters

我正在制作此实用程序类,我希望能够将其他选项传递给我的方法:

import java.util.Random;

public class DataGen {
    public static final int OPTION1 = 1;
    public static final int OPTION2 = 2;
    public static final int OPTION3 = 4;

    private static Random gen = new Random();

    public static String generateString(int n, int options) // <-------
    {
        if (options == OPTION1)
        {
            //...
        }
        else if (options == (OPTION1 | OPTION3))
        {
            //...
        }

        //...

        return null;
    }
}

我想以这种方式调用方法:

public static void main(String[] args) {
    String k = DataGen.generateString(5, OPTION1 | OPTION2);
}

但这是编译器声明的唯一方式:

public static void main(String[] args) {
    String k = DataGen.generateString(5, DataGen.OPTION1 | DataGen.OPTION2);
}

有可能这样做吗?除了在 main 类中声明常量之外。

3 个答案:

答案 0 :(得分:4)

如果您真的想要,可以使用静态导入:

import static com.foo.bar.DataGen.*;

...

public static void main(String[] args) {
    String k = DataGen.generateString(5, OPTION1 | OPTION2);
}

静态导入允许使用静态导入的静态字段或方法,而不预先添加它所属的类。但滥用它们会导致更难阅读代码。

答案 1 :(得分:2)

您只需要进行静态导入:

import static DataGen.*;

答案 2 :(得分:2)

如前所述,您可以使用静态导入,如:

import static DataGen.*;

但这不是一个好主意。它主要从DataGen获取 所有 并将其粘贴在您的主类中。由于DataGen完全由静态方法和字段组成,因此几乎要破坏将DataGen作为单独的类的全部观点。 DataGen存在的唯一原因是为您的方法和字段提供轻微的位组织。

引用this answer

  

静态导入功能......对可读性和可测试性产生负面影响:

     
      
  • 将可能较大的类的内容转储到当前的命名空间中,使您的代码更难以阅读;现代IDE通过在程序中单击其名称来导航到对象的定义来缓解这种情况。
  •   
  • 您的代码依赖于静态对象,因此非常难以测试。例如,您无法轻松删除模拟记录器,并希望您的代码开始使用它。这是使用静态对象的一般限制 - 当您使用静态对象时,无论是否使用静态导入,都可以获得它。
  •   

更好的方法是只导入你需要的东西:

import static DataGen.OPTION1;
import static DataGen.OPTION2;
import static DataGen.OPTION3;

您还可以创建一个包含选项的内部类:

package staticimport;
import java.util.Random;

public class DataGen {
    public class Options {
        public static final int OPTION1 = 1;
        public static final int OPTION2 = 2;
        public static final int OPTION3 = 4;
    }

    private static Random gen = new Random();

    public static String generateString(int n, int options) // <-------
    {
        if (options == Options.OPTION1)
        {
            //...
        }
        else if (options == (Options.OPTION1 | Options.OPTION3))
        {
            //...
        }

        //...

        return null;
    }
}
package staticimport;
import static staticimport.DataGen.Options.*;

public class Tester {
    public static void main(String[] args) {
        String k = DataGen.generateString(5, OPTION1 | OPTION2);
    }
}

不幸的是,this requires DataGen to be in a package。但是,它确实提供了一个优势:它不会静态导入所有DataGen