Если у вас есть малейшие сомнения в том, что ваши требования могут измениться, что вам могут потребоваться разные версии некоторых методов для тестирования и т. Д., Используйте интерфейс и класс, например:
public interface Utils {
public final static Utils INSTANCE = new MyUtils();
Foo makeFoo();
Bar transform(Foo foo)
}
public class MyUtils implements Utils {
public Foo makeFoo() { return new Foo(); }
public Bar transform(Foo foo) { return new Bar(foo); }
}
Это позволяет легко переключаться на другие реализации. И у вас будет меньше проблем, когда вы решите начать использовать DI-фреймворк, такой как Guice:
public class Client {
private final Utils util;
@Inject
Client(Utils utils) { //<--- Here Guice will inject for you what you specified
this.utils = utils;
}
}