我正在制作此实用工具类,并希望使其能够将其他选项传递给我的方法:
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
。