2016-08-05 4 views
1

Недавно я перестраивал Java-код шахт, пытаясь устранить, где это возможно, static материал (переменные и методы) и заменить его лучшими методами кодирования.Reflection VS static stuff

Я также начал изучать отражение и заметил, что она позволяет мне сделать некоторые вещи , что, во-первых, я мог только достигнуть (или, по крайней мере, это то, как я вижу) с static звонков или ссылки.

Однако, хотя я читал, что использование static не рекомендуется, это не похоже на отражение.

Итак, я спрашиваю: вместо того, чтобы метод static и назвав его как ClassName.methodName(), это законное использование отражения делает его метод экземпляра и вызова его java.lang.reflect.Method.invoke()?


как динамически доступ к классу содержание


Вот пример кода:

Гипотетическая ситуация, которая работает (но я не хочу, чтобы метод static) :

import static java.lang.System.out; 


public class Foo 
{ 
    private static boolean light; 


    public Foo() 
    { 
     turnOn(); 
    } 

    public static void turnOn() 
    { 
     light = true; 
    } 

    public static void turnOff() 
    { 
     light = false; 
    } 

    public static boolean isGreenLight() 
    { 
     return light; 
    } 
} 

public class Boo 
{ 
    public Boo() 
    { 
     if (Foo.isGreenLight())  // I need to access Foo.isGreenLight() from here, but cur- 
     {        // rently that method is not static (it should be to do so) 
      out.println("Ok!"); 
     } 
    } 
} 

public final class Main 
{ 
    public static void main(String[] args) 
    { 
     final Boo boo = new Boo(); 
    } 
} 

Hypothetic situa ции, которые также должны работать (как бы с помощью отражения):

import static java.lang.System.out; 
import java.lang.reflect.Method; 


public class Foo 
{ 
    private boolean light; 


    public Foo() 
    { 
     turnOn(); 
    } 

    public void turnOn() 
    { 
     this.light = true; 
    } 

    public void turnOff() 
    { 
     this.light = false; 
    } 

    public boolean isGreenLight() 
    { 
     return this.light; 
    } 
} 

public class Boo 
{ 
    public Boo() 
    { 
     if ((boolean) Class.forName("Foo").getMethod("isGreenLight", null).invoke(new Foo(), null)) 
     { 
      out.println("Ok!"); 
     } 
    } 
} 

public final class Main 
{ 
    public static void main(String[] args) 
    { 
     final Boo boo = new Boo(); 
    } 
} 

Ожидаемый результат (непроверенные):

Ok!

+1

Речь идет не о том, как сделать вызов (прямое или отражение), а об изменении самого метода * себя * на нестатический. Если вы просто измените прямой вызов на вызов отражения, но оставите метод как статический метод, тогда вы только что сделали код * хуже !! * – Andreas

+1

Что вы подразумеваете под «извлекать значение из этого метода»? ? Получить значение, которое оно возвращает? Может быть, вы должны дать образцы кода. –

+0

@Andreas Да, я говорю о возможности изменения метода для нестатического и доступа к нему с помощью Reflection –

ответ

4

Использование отражения - это запах кода, особенно если намерение позади того, что вы пишете, не оправдывает его.

Трудно сказать гораздо больше, не видя кода, поскольку все это просто догадки.

Я:

  • перечислить причины, почему у вас эти static членов в первую очередь

  • определить, если модификатор static был на самом деле правильное решение в первую очередь: т.е. должны ли они быть экземплярами или членами класса? Как они могут использоваться «клиентами» рассматриваемых классов? Какую парадигму я использую? Функциональный или объектно-ориентированный код. Соответствует ли это требованиям DRY, SOLID и KISS?

  • считают, если я более-инженерии в первую очередь

Что еще более важно:

  • Я бы разработать свой код через испытания первый, который приводит в движение дизайн вашего API глазами пользователя, с дополнительным преимуществом, которое у вас есть для тестирования, до того, как вы его уже внедрили. Часто при написании кода таким образом я устраняю такие вопросы, потому что решение становится более очевидным при мысли с точки зрения пользователя, а не дизайнера. Это становится вопросом прагматизма, а не удовлетворением архитектурных целей и философий.
+0

Я не уверен, что вы являетесь инженером первой точки. Я чувствую, что «статический» чрезмерен ОП, но я признаю, что трудно сказать без примера –

+0

Как можно оправдать дизайнерское решение чрезмерной инженерией? –

+0

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