在过去十年左右的时间里,我一直在将以下模式用于Java实用程序类。该类仅包含静态方法和字段,已声明final
为无法扩展,并且具有private
构造函数因此无法实例化。
public final class SomeUtilityClass {
public static final String SOME_CONSTANT = "Some constant";
private SomeUtilityClass() {}
public static Object someUtilityMethod(Object someParameter) {
/* ... */
return null;
}
}
现在,随着Java 8
接口中静态方法的引入,我最近发现自己使用了实用程序接口模式:
public interface SomeUtilityInterface {
String SOME_CONSTANT = "Some constant";
static Object someUtilityMethod(Object someParameter) {
/* ... */
return null;
}
}
这使我摆脱构造,和大量的关键字(个public
,static
,final
),这些接口中隐含的。
这种方法有不利之处吗?通过实用程序接口使用实用程序类有什么好处?
以为Constant Interface模式创建反模式的人为基础,我想说,尽管您不打算让客户端实现该接口,但它仍然有可能,可能更容易并且 不应被允许
:
API应该易于使用且难以滥用。做简单的事情应该很容易;可能做复杂的事情; 并且不可能或至少很难做错事。
尽管如下所述,但这确实取决于目标受众
许多易于使用的设计模式都受到了很多批评(上下文模式,单例模式,常量接口模式)。哎呀,甚至像得墨meter耳定律这样的设计原则也因过于冗长而受到批评。
我不想这么说,但是这些决定都是基于意见的。尽管上下文模式被视为一种反模式, 但在诸如Spring和Android SDK之类的主流框架中很明显
。它归结为环境以及目标受众。
我可以找到的主要缺点 是在Constant Interface
wiki中的“缺点”下列出的第三项内容:
如果将来的发行版中要求二进制代码兼容,则常量接口必须永远保持一个接口(无法将其转换为类), 即使它在常规意义上并未用作接口。
如果您曾经想过“嘿,这实际上不是合同,我想执行更强大的设计”,则您将无法对其进行更改。但正如我所说,这取决于您;也许您将来不会在意更改它。
最重要的是,@
TagirValeev提到的代码清晰度。接口的目的是实现;如果您不希望某人实现您提供的API,请不要使其实现。但是,我认为这与“目标受众”声明有关。不会撒谎,我会在不太冗长的基础上与您同在,但这取决于我的代码适用于谁。不想使用可能会被检查的代码的常量接口。
问题内容: 出于好奇,除了cglib之外,是否有任何(稳定)开源项目用于运行时Java代码生成?我为什么要使用它们? 问题答案: ASM [java-asm](file:///C:/questions/tagged/java-asm “显示标记为“ java-asm”的问题”) CGLIB和几乎所有其他库都建立在ASM之上,而ASM本身的作用很低。对于大多数人来说,这是一个阻止因素,因为您必须了解
问题内容: 根据文档: [ java.lang.reflect.]Proxy提供了用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。 该newProxyMethod方法(负责生成动态代理)具有以下签名: 不幸的是,这阻止了人们生成扩展特定抽象类的动态代理(而不是实现特定接口)。考虑到java.lang.reflect.Proxy“所有动态代理的超类”,这是有道理的,因
我的错误:(上面的行)绑定不匹配:MyUtil类型的泛型方法bubbleSort(List,List)不适用于参数(ArrayList,ArrayList)。推断的类型Country不是有界参数>}的有效替代品
我正在阅读下面Joe Albahari优秀的“C9简而言之”的摘录,并试图理解这里用粗体描述的内容。有人能用我更能理解的方式解释替代方法吗?出于某种原因,这对我来说似乎有些落后。
我浏览了“http://www . IBM . com/developer works/Java/library/j-jtp 10264/”这篇文章。他们提到“锁框架是同步的兼容替代品”。我知道通过使用可重入锁,我们可以跨方法持有锁,等待锁一段时间(使用同步块(或)方法是不可能的)。我的疑问是,有没有可能用带有可重入锁的同步机制来代替应用程序? 例如,我想实现一个线程安全的堆栈数据结构,其中所有的