我为常规的简单命令创建了一个pkg。它们是非静态的,更具可扩展性,但由于创建了一个使用对象而使用起来更耗时。我的其他课程使用它们。
$ ls *.java
CpF.java IsBinary.java RmLn.java Tools.java
F2S.java IsRoot.java SaveToDisk.java WordCount.java
Filters.java ModRelativePaths.java SetWord.java WordNumber.java
Find.java powerTools.java Sort.java
您会选择哪种方式更轻松地使用它们?
静态VS对象讨论
代码无法使用我的类和Pkg
的Import-static$ cat Test.java
import static a.*;
public class Test
{
public static void main(String[] args)
{
a.printHello();
}
}
$ cat a/Hello.java
import java.io.*;
public class Hello
{
public static printHello(){System.out.println("Hello");}
}
$ javac Test.java
Test.java:1: cannot find symbol
symbol: class a
import static a.*;
^
Test.java:7: cannot find symbol
symbol : variable a
location: class Test
a.printHello();
^
2 errors
$ sed -i 's@a.printHello@printHello@g' Test.java
$ javac Test.java
Test.java:1: cannot find symbol
symbol: class a
import static a.*;
^
Test.java:7: cannot find symbol
symbol : method printHello()
location: class Test
printHello();
答案 0 :(得分:3)
乍一看,我敢打赌,他们都没有维持任何状态,因此可以安全地宣布static
。我还有这样的印象,即每个类实际上只有一个公共方法,它只能同时执行一个任务。听起来好像它们与特定平台相关联。
如果以上都是真的,那么你有两个选择:
只需将它们全部放在public final class PowerTools
类中,并使用private
构造函数(以便无法实例化)和public static
方法,每个方法都执行所需的任务。您最终可以使用原始类名作为方法名称。
定义public interface PowerTools
,以便您可以相应地实施LinuxPowerTools
,WindowsPowerTools
,MacPowerTools
等等,并创建一个抽象PowerToolsFactory
来返回基于当前平台自动实现所需的实现(您可以使用系统属性os.name
来嗅探当前平台)。
如果这是出于纯粹的爱好目的,选项1就足够了。但是如果你理解我的意思,选项2更“专业”。
更新:根据您的更新,您可以使用import static
语句。另请参阅此Sun Tutorial。
E.g。
import static java.lang.System.*;
public class Test {
public static void main(String... args) {
out.println("foo");
exit(-1);
}
}
如果您的com.example.PowerTools
类包含public static
方法,则可以按如下方式导入:
import static com.example.PowerTools.*;
public class Test {
public static void main(String... args) {
if (isBinary(file)) {
// ...
}
saveToDisk(file);
}
}
答案 1 :(得分:0)
我定义了一个只有静态方法的G类。所以我打电话 G.print G.sort G.find等。
答案 2 :(得分:0)
我建议你将一些功能组合成一个单独的类。然后,通过静态方法公开您的API,甚至只是简单地:
boolean isRoot = new DirectoryHelper().isRoot(someFile);
boolean isBinary = new DirectoryHelper().isBinary(someFile);
new DirectoryHelper().saveToDisk(someFile);
是的,您每次都在创建新对象,但除非您执行这些操作数万次,否则此开销将永远不会被注意到。通过上面的方法,您现在拥有一个更易于测试的类,并且更容易使用。
进行依赖注入答案 3 :(得分:0)
如果这些是要在shell中使用的命令行工具,请将所有类放在一个JAR中,并编写一个简短的脚本来按名称调用每个类。将脚本存储在您的路径中,例如~/bin
。
#!/bin/sh
java -cp your.jar pkg.Find "${@}"
#!/bin/sh
java -cp your.jar pkg.Sort "${@}"
等。 "${@}"
转发任何参数。