2015-10-03 6 views
1

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

public class StaticHelper { 
    public static Class<StaticHelper> doSomthing() { 
     System.out.println("I just did something !!"); 
     return StaticHelper.class; 
    } 

    public static Class<StaticHelper> doSomthingElse() { 
     System.out.println("I just did something else !!"); 
     return StaticHelper.class; 
    } 

    public static void main(String[] args) { 
     // Does not compiles 
     StaticHelper.doSomthing().doSomthingElse(); 
    } 
} 

Возможно ли это? Если такой простой пример, как указано выше, будет очень полезен.

+0

Java статически типизированный. То, что вы пытаетесь сделать, не имеет смысла. Либо вызовите статические методы напрямую, либо вызовите методы экземпляра, используя интерфейсы. – Andreas

+0

Могу я спросить: почему вы хотите это сделать? ** static ** следует рассматривать как неудобную вещь в объектно-ориентированном программировании; и у него много недостатков; например, он может очень тяжело писать блок-тесты - так почему вы хотите использовать статику таким образом? – GhostCat

+0

Обратите внимание: статистические данные являются плохими, если у вас есть статические члены, также называемые GLOBAL STATE. Если статические классы не содержат ГЛОБАЛЬНОЕ СОСТОЯНИЕ, им не больно подвергаться тестированию на единицу. –

ответ

2

это невозможно, но используя static imports есть.

public class StaticHelper { 
    public static void doSomething() { 
     System.out.println("I just did something !!"); 
    } 

    public static void doSomethingElse() { 
     System.out.println("I just did something else !!"); 
    } 
} 

в другом классе:

import static StaticHelper.*; 

class Other { 
    public static void main(String[] args) { 
     doSomething(); // calls static methods from StaticHelper 
     doSomethingElse(); 
    } 
} 

или - если методы логически связаны - вы можете иметь один статический фабричный метод, а остальные методы экземпляра:

public class StaticHelper { 
    public static void beginDoingSomething() { 
     // static factory method - you can pass parameters to it if needed 
     System.out.println("I just did something !!"); 
     return new StaticHelper(); 
     // if needed, initialize the instance with the parameters 
    } 

    public StaticHelper andDoSomethingElse() { 
     // instance method 
     // can use the instance parameters (passed to the constructor in the static factory method) 
     // or use parameters passed to this method 
     System.out.println("I just did something else !!"); 
     return this; 
     // returns this for chaining 
    } 
} 

в другой класс:

import static StaticHelper.*; 

class Other { 
    public static void main(String[] args) { 
     doSomething().andDoSomethingElse().andDoSomethingElse(); 
    } 
} 

Если назвать методы хорошо, Вы можете сформировать предложение:

validate(object).checkEmail().checkName().checkTelephoneStartsWith("+11"); 

где validate(object) статический фабричный метод построения нового экземпляра валидатор для данного object.

+0

Да, я знаю .. но есть ли способ избежать всех этих нескольких заявлений за звонок? –

+0

Смотрите мое обновление для альтернативного решения –

+0

Да, спасибо. Это определенно способ сделать это. –

2

Я думаю, вы хотите что-то вроде этого.

public class StaticHelper { 
    private final static StaticHelper INSTANCE = new StaticHelper(); 

    public static StaticHelper doSomthing(){ 
     System.out.println("I just did something !!"); 
     return INSTANCE; 
    } 

    public static StaticHelper doSomthingElse(){ 
     System.out.println("I just did something else !!"); 
     return INSTANCE; 
    } 

    public static void main(String[] args) { 
     StaticHelper.doSomthing().doSomthingElse(); 
    } 
} 

или другой способ

public class StaticHelper { 
    public static SomeClass doSomthing(){ 
     return new SomeClass().doSomthing(); 
    } 

    public static SomeClass doSomthingElse(){ 
     return new SomeClass().doSomthingElse(); 
    } 

    public static void main(String[] args) { 
     StaticHelper.doSomthing().doSomthingElse(); 
    } 

    private static class SomeClass { 

     public SomeClass doSomthing(){ 
      System.out.println("I just did something !!"); 
      return this; 
     } 

     public SomeClass doSomthingElse(){ 
      System.out.println("I just did something else !!"); 
      return this; 
     } 
    } 
} 
+0

Нет, статические синглы - это ЗЛО. Что-нибудь другое? Но обязательно, если класс меньше. –

+0

Я отредактировал свой ответ. Возможно, это поможет вам решить вашу проблему. –

+0

Я думаю, что Adam Michalik делает почти то же самое, но некоторые, как я нахожу его более читабельным. Мне больше понравился ваш предыдущий пример. Это было намного проще и удобочитаемо. В следующем примере я немного озадачен, думая, сколько экземпляров объектов создавались. –

Смежные вопросы