рдФрд░ рдлрд┐рд░ рд╕реЗ рдЖрд▓рд╕реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рд╢реБрдн рджреЛрдкрд╣рд░

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, "рдЖрд▓рд╕реНрдп рдкреНрд░рдЧрддрд┐ рдХрд╛ рдЗрдВрдЬрди рд╣реИ", рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЧреБрдг, рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрджреНрднреБрдд рдврд╛рдВрдЪреЗ рджрд┐рдЦрд╛рдИ рджрд┐рдП рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЖрдЧреЗ рднреАред рд▓реЗрдХрд┐рди рдЖрдЬ рдореИрдВ рдорд╛рдирд╡реАрдп рдЖрд▓рд╕реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ рдореИрдВ рдПрдХ рдлрд╝реАрдЪрд░ рдХреЗ рдбреНрд░рд╛рдлреНрдЯ рд░рдлрд╝ рдбреНрд░рд╛рдлреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдпрд╛ рдерд╛, рдЕрдВрддрд┐рдо рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдЖрд▓рд╕реА рд╕рдВрд╢реЛрдзрдХред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЬрдм рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЙрдкрдпреЛрдЧреА рдереА, рддреЛ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирд╣реАрдВ, рдХреЛрдИ рднреА рддрд░реНрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЙрдЧрд░ рдУрд╡рд░рд╣реЗрдб рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╢реБрд░реВ рдореЗрдВ рдмрдирд╛рдПрдВ, рдлрд┐рд░ рдзреНрдпрд╛рди рд░рдЦреЗрдВред рдУрд╣ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдмреИрд╕рд╛рдЦреА рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╕рдВрднрд╡ рд╣реИ?

рдФрд░ рдЕрднреА рд╕реЗ рдХреЛрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рджреЗрдВ


рдкрд╣рд▓рд╛ рдирд┐рд░реНрдгрдп "рдорд╛рдереЗ рдкрд░ рд╣реИред" рд╣рдо org.slf4j.Logger рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ slf4j рдХреЛ рдЪреБрдирд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓реЙрдЧрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╣реА рд╣реИ), рдЕрд╕рд▓реА рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХреЛ рдШреЗрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░реЙрдХреНрд╕реА рдкреИрдЯрд░реНрди рдкреНрд▓рд╕ рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

public class LazyLogger implements Logger { private Logger realLogger; private Class<?> clazz; private LazyLogger(Class<?> clazz) { this.clazz = clazz; } public static Logger getLogger(Class<?> clazz) { return new LazyLogger(clazz); } private Logger getRealLogger() { if (realLogger == null) realLogger = LoggerFactory.getLogger(this.clazz); return realLogger; } @Override public void trace(String msg) { getRealLogger().trace(msg); } @Override public void debug(String msg) { getRealLogger().debug(msg); } : :  

рд▓реЗрдХрд┐рди рд░реБрдХреЛ, org.slf4j.Logger рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд▓рдЧрднрдЧ 40 рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЙрди рд╕рднреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдФрд░ getRealLogger () рдереНрд░реЗрдб рд╕реЗрдл рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЪрд▓реЛ рдЖрдЧреЗ рд╕реЛрдЪрддреЗ рд╣реИрдВред

рд╡рд┐рд╖рдп рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рдирд╛


рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, @Delegate рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд▓реЛрдореНрдмреЛрдХ рд╣реИ ред

 @AllArgsConstructor(staticName = "getLogger") public class LazyLogger implements Logger { private final static Function<Class<?>, Logger> $function = LoggerFactory::getLogger; private Logger $logger = null; private final Class<?> clazz; @Delegate private Logger getLogger() { if ($logger == null) $logger = $function.apply(clazz); return $logger; } } : private static final Logger logger = LazyLogger.getLogger(MyClass.class); 

@ рдбреЗрд▓рдЧреЗрдЯ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп org.slf4j.Logger рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдердб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЕрдВрджрд░, рдпрд╣ getLogger () + <рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐> рдХрд╣рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдХреЙрд▓ рдХреЗ рд╕рдордп, $ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдмрдирд╛рддрд╛ рд╣реИред $ рдЙрдиреНрд╣реЗрдВ рд▓реЛрдореНрдмреЛрдХ рд╕реЗ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрддреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдпрд╣ рдЧреЗрдЯрд░реНрд╕ / рд╕реЗрдЯрд░реНрд╕ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред

рддреЛ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЧрд╛рдпрдм рд╣реИред рдУрд╣ рдЬрд╝рд░реВрд░! рдзрд╛рдЧрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдЕрдм GetLogger () рдореЗрдВ рд╣рдо рдПрдХ рдбрдмрд▓ рдЪреЗрдХ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ AtomicReference рдХреЗ рд╕рд╛рде рднреА! рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП, рд▓реЛрдореНрдмреЛрдХ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА @Getter (рдЖрд▓рд╕реА = рд╕рдЪ) рд╣реИ !ред

 @RequiredArgsConstructor(staticName = "getLogger") public class LazyLoggerThreadSafe implements Logger { private static final Function<Class<?>, Logger> $function = LoggerFactory::getLogger; private final Class<?> clazz; @Getter(lazy = true, onMethod_ = { @Delegate }, value = AccessLevel.PRIVATE) private final Logger logger = createLogger(); private Logger createLogger() { return $function.apply(clazz); } } : private static final Logger logger = LazyLoggerThreadSafe.getLogger(MyClass.class); 

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬреЛ рд▓реЛрдореНрдмреЛрдХ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдЙрддреНрдкрдиреНрди рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдИ рдмрд╛рд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред @Getter (рдЖрд▓рд╕реА = рд╕рддреНрдп) рдХреЗ рдкрд╣рд▓реЗ рдкрд╛рд╕ рдХреЗ рджреМрд░рд╛рди , GetLogger () Lazy initialization рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ @Delegate рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдФрд░ рджреВрд╕рд░реЗ рдкрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, @ рдбреЗрд▓реАрдЧреЗрдЯ рд╕реЗ рдЦреБрдж рдХреЗ рддрд░реАрдХреЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ ред

рдФрд░ рдорд┐рдард╛рдИ рдХреЗ рд▓рд┐рдП


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рдЖрд▓рд╕реА рдХреЛ рдПрдХ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рди рдХрд┐ рд▓реЙрдЧрд░ рдЕрдЧрд░ рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЖрд▓рд╕реА рдлреИрдХреНрдЯрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдХреЛ рдХрд╣рд╛рдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реВрдВрдЧрд╛? @ рдбреЗрд▓реАрдЧреЗрдЯ рдЕрдм рд╣рдореЗрдВ рдирд╣реАрдВ рдмрдЪрд╛рдПрдЧрд╛, рдЙрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд╣рдо рдбрд╛рдпрдиреЗрдорд┐рдХ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 @AllArgsConstructor(access = AccessLevel.PRIVATE) public class LazyFactory<I> { private Class<I> interfaceClass; private Supplier<I> supplier; @SuppressWarnings("unchecked") private I getLazyObject() { return (I) Proxy.newProxyInstance( LazyFactory.class.getClassLoader(), new Class[] { interfaceClass }, new LazyFactory.DynamicInvocationHandler()); } public static <T> T getLazy(Class<T> interfaceClass, Supplier<T> supplier) { return new LazyFactory<T>(interfaceClass, supplier).getLazyObject(); } private class DynamicInvocationHandler implements InvocationHandler { @Getter(lazy = true) private final I internalObject = supplier.get(); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(getInternalObject(), args); } } } : public interface Hello { void sayHello(); } public class LazyHello implements Hello { public LazyHello() { System.out.println("LazyHello under constuction"); } @Override public void sayHello() { System.out.println("I'm very lazy for saying Hello.."); } } private static final Hello lazyObj = LazyFactory.getLazy(Hello.class, LazyHello::new); lazyObj.sayHello(); 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЛрдореНрдмреЛрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдореЗрдВ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреЗ рдХреБрдЫ рд╢рдмреНрджред рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдореЗрдВ LazyFactory рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЙрдХреНрд╕реА рджреЗрддрд╛ рд╣реИред рдбрд╛рдпрдирд╛рдорд┐рдХрдЗрдиреНрд╡рд╛рд╡реЗрд╢рдирд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕реНрддреБ" рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рддрдм рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЗрдирд╡реЛрдХ () рдбрд╛рдпрдирд╛рдорд┐рдХрдЗрдиреНрд╡рд╛рд▓реЗрд╢рдирд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ I рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХред
GetInternalObject () рдЬреЛ @Getter (рдЖрд▓рд╕реА = рд╕рддреНрдп) рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕реНрддреБ" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

рд╡рд┐рд╖рдп рдХреЛ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХрд╛ рдЖрд▓рд╕реАрдХрд░рдг рдореМрдЬреВрджрд╛ рдХреЛрдб рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдЖрд╕рд╛рди рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж, рдСрд▓ рдж рдмреЗрд╕реНрдЯ!

рд╕рдВрджрд░реНрдн:

JEP рдбреНрд░рд╛рдлреНрдЯ: рдЖрд▓рд╕реА рд╕реНрдЯреЗрдЯрд┐рдХ рдлрд╛рдЗрдирд▓ рдлреАрд▓реНрдбреНрд╕
рд▓рдВрдмреЛрдХ

Source: https://habr.com/ru/post/hi424029/


All Articles