我正在制作此实用程序类,我希望能够将其他选项传递给我的方法:
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 类中声明常量之外。
答案 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
。