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

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


是否有可能做到这一点?当然不是在主类中声明常量。

最佳答案

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

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

08-08 03:14