2016-10-11 7 views
0

Недавно я изучаю, как использовать Slf4j. И я знаю два новых понятия: статическое связывание и динамическое связывание. В JCL (Jakarta Commons Logging) он использует динамическое связывание для выбора реализации, в то время как Slf4j использует статическую привязку. В этом случае мы знаем, что Slf4j более мудр. Но как насчет другого случая?Когда использовать статическую привязку и когда использовать динамическое связывание в Java?

Если мы сталкиваемся с проблемой, которую мы можем решить как при использовании статического бинга, так и в динамической привязке, то как мы выбираем? Существуют ли какие-либо основные правила?

Мой английский не очень хороший. Так что я не уверен, ясно ли я дал понять. Если у вас есть еще вопрос, прокомментируйте.

THX.

+0

вы можете использовать 'instanceof', надеясь, что знаете о полиморфных операциях –

ответ

0

Здесь: Link

Мало важное различие между статической и динамической привязки

1) Статическое связывание в Java происходит во время компиляции, а динамическое связывание происходит во время исполнения.

2) частные, окончательные и статические методы и переменные используют статическое связывание и связывание компилятором, а виртуальные методы связаны во время выполнения на основе объекта времени выполнения.

3) Статическое связывание использует информацию типа (класс в Java) для привязки, тогда как динамическое связывание использует Object для разрешения привязки.

3) Перегруженные методы связаны с использованием статического связывания, а переопределенные методы связаны с использованием динамического связывания во время выполнения.

Static Binding Пример в Java

public class StaticBindingTest 
{ 
    public static void main(String args[]) 
    { 
    Collection c = new HashSet(); 
    StaticBindingTest et = new StaticBindingTest(); 
    et.sort(c); 
    } 
    //overloaded method takes Collection argument 
    public Collection sort(Collection c) 
    { 
    System.out.println("Inside Collection sort method"); 
    return c; 
    } 
    //another overloaded method which takes HashSet argument which is sub class 
public Collection sort(HashSet hs) 
{ 
    System.out.println("Inside HashSet sort method"); 
    return hs; 
} 
} 

Выход: Внутри коллекции метод сортировки

Пример динамического связывания в Java

public class DynamicBindingTest 
{ 
    public static void main(String args[]) 
    { 
     Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car 
     vehicle.start();  //Car's start called because start() is overridden method 
    } 
} 

class Vehicle 
{ 
    public void start() 
    { 
     System.out.println("Inside start method of Vehicle"); 
    } 
} 
class Car extends Vehicle 
{ 
    @Override 
    public void start() 
    { 
     System.out.println("Inside start method of Car"); 
    } 
} 

Выход: Внутри начать метод автомобиля

+0

Thx для вашего ответа. Но я хочу сказать, что знаю разницу. Я хочу знать, как выбирать, как Slf4j, когда он решает, какой из них использовать для привязки реализации. JCL использует динамический, но Slf4j использует статический. Вы получаете это? –

+0

Ошибки времени компиляции всегда лучше ошибок во время выполнения. Лучше сделать раннее связывание, а не позднее привязки, чтобы узнать о проблемах, с которыми вы сталкиваетесь во время компиляции – Wearybands