Ручка системы как зависимость - PullRequest
1 голос
/ 10 февраля 2011

Есть ли способ использовать java.lang.System для внедрения зависимостей?

В настоящее время я создаю свои классы

public class MyClass
{
    private final Dependency iDependency;

    public MyClass(Dependency pDependency)
    {
        this.iDependency = pDependeny;
    }

    public static MyClass createInstance()
    {
        final Dependency tDependency = Dependency.createInstance();
        final MyClass tInstance = new MyClass(tDependency);
        return tInstance;
    }

    // ... class methods ...
}

и создаю их с помощью:

MyClass tMyClass = MyClass.createInstance();

и для теста я использую:

@Test
public void testMethod()
{
    // Setup
    Dependency tTestDependency = new TestDependency();
    MyClass tMyClass = new MyClass(tTestDependency);
    // Test
    tMyClass.method();
}

Теперь у меня проблема с тем, что у меня есть java.lang.System в качестве зависимости, поскольку я хочу написать консольный логгер.У меня нет проблем с установкой System как Datatyp для зависимости, однако Eclipse говорит «нет», когда я хочу установить System в качестве параметра.Я получаю сообщение об ошибке «Система не может быть преобразована в переменную».

public class ConsoleLogger
{
    private final System iSystem; // works

    public MyClass(System pSystem) // works
    {
        this.iSystem = pSystem;
    }

    public static ConsoleLogger createInstance()
    {
        final ConsoleLogger tInstance = new ConsoleLogger(System); // Here I get an error: System cannot be resolved to a variable
        return tInstance;
    }

    public void logInfo(String pMessage)
    {
        final String tPrintMsg = this.iSystem.currentTimeMillis() + " INFO - " + pMessage;
        this.iSystem.out.println(tPrintMsg);
    }
}

Я могу установить System.err и System.out как зависимости с типом данных PrintStream, но System.currentTimeMillies () все равно не будет охвачен.

Кто-нибудь знает, как обращаться с Системой как с зависимостью в этом сценарии?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Класс System содержит несколько полезных полей и методов класса. Он не может быть создан.

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

interface MySystem {
    PrintStream getOut();
    InputStream getIn();
    ....
}

class MySystemImpl {
    PrintStream getOut() {
        return System.out;
    }
    ...
}
1 голос
/ 10 февраля 2011

То, что вы делаете, не имеет большого смысла.Класс System равен final и имеет конструктор private, поэтому вы не можете создать его экземпляр.Кроме того, все его методы и поля являются статическими, поэтому нет смысла его создание и нет смысла с переменной этого типа.

Просто чтобы помочь вамСледует понимать, что когда вы ссылаетесь на статический метод или поле через ссылку на экземпляр, ссылка игнорируется.Таким образом, эти две версии logInfo делают ТОЧНО одно и то же.

public void iLogInfo(String pMessage)
{
    final String tPrintMsg = this.iSystem.currentTimeMillis() + " INFO - " + pMessage;
    this.iSystem.out.println(tPrintMsg);
}

public void sLogInfo(String pMessage)
{
    final String tPrintMsg = System.currentTimeMillis() + " INFO - " + pMessage;
    System.out.println(tPrintMsg);
}

(Это один из тех случаев, когда язык Java позволяет вам писать код, который означает что-то немного отличное от того, что кажется. Шашки стилей и (IIRC) некоторые IDE будут предупреждать вас, если вы ссылаетесь на статический член через ссылку на экземпляр. IMO это хорошая идея, чтобы учесть это предупреждение.)

0 голосов
/ 10 февраля 2011

System.out, System.in и System.err, а также System.currentTimeMillis () являются статическими методами в System.Я бы разглядел и ошибочно определил зависимости, а затем получил бин DateUtil, который можно подключить с помощью метода currentTimeMillis.Вы могли бы сделать это с bean-компонентом SystemWrapper, но, похоже, ошибки и ошибки выглядят совершенно отдельно от операций с датами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...