Java: реализация простых команд - PullRequest
2 голосов
/ 05 мая 2010

Я создал 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. разработать небольшой интерфейс, такой как 'powerTools.java' для pkg.
  2. для создания класса со статическими методами для них.
  3. для добавления статического метода к каждому классу
  4. прекратить чрезмерное использование «создания слишком большого количества файлов» и централизации некоторых?
  5. Куда еще?

Статический VS объект-обсуждение

  1. Как можно заставить внешние методы работать, как в их собственных классах, не ссылаясь на них по имени класса? Не имя_класса.method (), а метод (). Внешние методы взяты из отдельных pkgs.

Код не работает с Import-static с моим классом и Pkg

$ 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 ]

3 голосов
/ 05 мая 2010

На первый взгляд, держу пари, что ни один из них не поддерживает никакого состояния и поэтому может быть безопасно объявлен static. У меня также сложилось впечатление, что у каждого класса есть только один публичный метод, который выполняет только одну задачу одновременно. Это также звучит так, как будто они привязаны к конкретной платформе.

Если все вышеперечисленное верно, то у вас есть 2 варианта:

  1. Просто сгруппируйте их все в класс public final class PowerTools с помощью конструктора private (чтобы его нельзя было создать) и public static методов, каждый из которых выполняет нужную задачу. В конечном итоге вы можете использовать исходное имя класса в качестве имени метода.

  2. Определите public interface PowerTools, чтобы вы могли соответственно реализовать LinuxPowerTools, WindowsPowerTools, MacPowerTools, и так далее и создать абстрактный PowerToolsFactory для автоматического возврата желаемой реализации на основе текущей платформы можно использовать системное свойство os.name, чтобы прослушать текущую платформу).

Если это только для хобби, достаточно варианта 1. Но вариант 2 более «профессиональный», если вы понимаете, о чем я.

Обновление : согласно вашему обновлению вы можете использовать для этого оператор import static. Также смотрите этот Sun Tutorial .

1034 * Е.Г. *

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);
    }
}
0 голосов
/ 05 мая 2010

Если это инструменты командной строки, предназначенные для использования из оболочки, поместите все классы в один JAR и напишите короткий скрипт для вызова каждого из них по имени. Сохраните сценарии на своем пути, например, ~/bin.

#!/bin/sh
java -cp your.jar pkg.Find "${@}"

#!/bin/sh
java -cp your.jar pkg.Sort "${@}"

и т.д.. "${@}" передает любые параметры.

0 голосов
/ 05 мая 2010

Я бы посоветовал вам объединить некоторые из этих функций в один класс. Затем представьте свой API с помощью статических методов или даже просто:

boolean isRoot = new DirectoryHelper().isRoot(someFile);
boolean isBinary = new DirectoryHelper().isBinary(someFile);
new DirectoryHelper().saveToDisk(someFile);

Да, вы создаете новые объекты каждый раз, но если вы не выполняете эти операции десятки тысяч раз, эти издержки никогда не будут замечены. А с помощью описанного выше метода теперь у вас есть класс, который легче тестировать и который легче внедрить с помощью зависимости.

0 голосов
/ 05 мая 2010

Я определяю один класс, G, который имеет только статические методы. Так я звоню G.print G.sort G.find и т. Д.

...