Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java构造函数/方法标记为不供客户端使用的首选方法?_Java_Deprecated_Setter_Default Constructor - Fatal编程技术网

将Java构造函数/方法标记为不供客户端使用的首选方法?

将Java构造函数/方法标记为不供客户端使用的首选方法?,java,deprecated,setter,default-constructor,Java,Deprecated,Setter,Default Constructor,我想将一些默认构造函数和setter标记为不可用/建议使用。我需要它有点类似于注释@Deprecated,但它不应该有相同的含义。我只是添加了构造函数和setter,因为一些框架让我这么做(Hibernate、Spring、Jackson)。你知道这样的构造是否存在吗?使它们受到保护,这是通常用来防止它们在别处被调用的方法。如果框架希望它们是公共的,那么您几乎无能为力,除非您可以将它们配置为不这样做。据我所知,您想找到一种方法来处理一些框架需求而不费吹灰之力吗?您希望避免Java Bean命名约

我想将一些默认构造函数和setter标记为不可用/建议使用。我需要它有点类似于注释
@Deprecated
,但它不应该有相同的含义。我只是添加了构造函数和setter,因为一些框架让我这么做(Hibernate、Spring、Jackson)。你知道这样的构造是否存在吗?

使它们受到保护,这是通常用来防止它们在别处被调用的方法。如果框架希望它们是
公共的
,那么您几乎无能为力,除非您可以将它们配置为不这样做。

据我所知,您想找到一种方法来处理一些框架需求而不费吹灰之力吗?您希望避免Java Bean命名约定,同时能够看到由此类框架处理的代码?据我所知,使用普通Java语言是不可能的,您可以使用AOP/字节码增强工具来修饰类以与此类框架兼容。。。。这可能有效,但有不同的缺点: -增加复杂性 -维护可能很棘手 您可以使用个人注释来指导字节码增强

另一种观点是使用分形方法,但这个框架并不广为人知,即使它是我所知道的最令人印象深刻的框架之一。你可以看看这里:


jerome

这里真正的答案是只在API之外公开接口和工厂。这允许您隐藏由于框架的原因可能需要非私有的方法

如果无法执行此操作,请尝试将方法设置为默认范围(而不是受保护的


此外,还可以使用注释作为内部标记。在我的项目中,我们为此创建了注释:
PresentForDependancyInjection
和/或
FrameworkEntryPoint
。这些只是装饰性的注释,但能让人明白要点。

@Deprecated看起来是最好的选择,或者您可以将它们设置为受保护、包保护或私有(不知道spring或hibernate是否允许您这样做)。您为什么不希望它们可用?如果这些框架需要它们,它们很可能会使用它们。您可以创建自己的注释,而不需要任何意义,并将其放在您的构造函数/方法上。然后由开发人员来尊重您的约定。根据我的经验,开发人员不这样做。我认为默认范围比受保护的范围更好,因为它更具限制性。它如何更具限制性?默认为包级别,受保护的仅为同一类和子类<代码>私有
更具限制性,不是默认值。受保护的是包级别和子类。将一个类标记为libraries类的子类是很容易的,但是为另一家公司/项目声明一个包以便能够使用包作用域是非常奇怪的。不完美,但更好。糟糕的是,我记得Java的
protected
等同于C++(仅限继承者)。