Java:简单命令的实现

时间:2010-05-04 20:55:29

标签: java interface static implementation package

我为常规的简单命令创建了一个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

您会选择哪种方式更轻松地使用它们?

  1. 为pkg开发一个像'powerTools.java'这样的小界面。
  2. 使用静态方法为它们创建一个类。
  3. 为每个类添加静态方法
  4. 停止过度使用“创建太多文件”并集中管理一些文件?
  5. sthing else?
  6. 静态VS对象讨论

    1. 如何让外部方法像在自己的类中一样工作而不用类名引用它们?不是class_name.method(),只是方法()。外部方法来自单独的pkgs。
    2. 代码无法使用我的类和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();
      

4 个答案:

答案 0 :(得分:3)

乍一看,我敢打赌,他们都没有维持任何状态,因此可以安全地宣布static。我还有这样的印象,即每个类实际上只有一个公共方法,它只能同时执行一个任务。听起来好像它们与特定平台相关联。

如果以上都是真的,那么你有两个选择:

  1. 只需将它们全部放在public final class PowerTools类中,并使用private构造函数(以便无法实例化)和public static方法,每个方法都执行所需的任务。您最终可以使用原始类名作为方法名称。

  2. 定义public interface PowerTools,以便您可以相应地实施LinuxPowerToolsWindowsPowerToolsMacPowerTools等等,并创建一个抽象PowerToolsFactory来返回基于当前平台自动实现所需的实现(您可以使用系统属性os.name来嗅探当前平台)。

  3. 如果这是出于纯粹的爱好目的,选项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 "${@}"

等。 "${@}"转发任何参数。