Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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_Package_Deprecated - Fatal编程技术网

在Java中,最明显的反对包的方法是什么?

在Java中,最明显的反对包的方法是什么?,java,package,deprecated,Java,Package,Deprecated,我正在开发一个新的代码库,并将系统迁移到一个新的框架 有很多软件包我都不赞成,只是为了让其他开发人员非常清楚,这个软件包中的所有东西都不应该再用于新的开发 表示整个包已弃用的最佳方式是什么?您可以使用@deprecated:)创建并弃用任何包。您自己说过:您希望弃用包内的所有内容,而不是包本身。包只是一个名称空间,不推荐名称空间将具有不同的含义-比如不再使用此名称空间。例如,不要向该命名空间添加任何新项 在您的例子中,我建议您不要再使用每个类的每个公共方法(和字段)。这在现代IDE中变得显而易见

我正在开发一个新的代码库,并将系统迁移到一个新的框架

有很多软件包我都不赞成,只是为了让其他开发人员非常清楚,这个软件包中的所有东西都不应该再用于新的开发


表示整个包已弃用的最佳方式是什么?

您可以使用
@deprecated
:)创建并弃用任何包。

您自己说过:您希望弃用包内的所有内容,而不是包本身。包只是一个名称空间,不推荐名称空间将具有不同的含义-比如不再使用此名称空间。例如,不要向该命名空间添加任何新项

在您的例子中,我建议您不要再使用每个类的每个公共方法(和字段)。这在现代IDE中变得显而易见,当开发人员想要使用旧的类和方法时,他们会收到警告。您可以查看代码并逐步重构,以消除这些类和方法的依赖关系。

使用。创建在使用包时发出编译器警告的方面:

public aspect DeprecationAspect{

    declare warning :
        call(* foo.bar..*(..)) : "Package foo.bar is deprecated";

}

(如果使用或,您可以轻松地将AspectJ添加到构建中)

我最近不得不这样做,并使用
package info.java
文件来反对该包

将一个
package info.java
文件添加到您的包中,其中只包含包声明:

/**
 * @deprecated As of release 2.0, replaced by {@link com.acme.new.package}
 */
@Deprecated
package com.acme.old.package;

在Eclipse中,用户从该包中导入类的所有位置都将在下划线处加上不推荐警告。

对于后来的用户…
我的解决方案是“在路径中替换”

要查找的文本:(公共受保护)+(\s)(抽象)(\s)(静态)(\s)(最终)(\s)*(类|接口|枚举|枚举)
替换为:@已弃用\n\$1\$3\$5\$7\$9
选项:(选择)正则表达式

目录:{Choose dir}

正如@muymoo之前提到的,您可以使用
包info.java
文件。但您所能做的就是在文件的JavaDoc中添加一个
@deprecated
警告:

/**
 * @deprecated This package is deprecated, use {@link my.new.pkg} instead.
 */
package my.old.pkg;
JavaDoc实际上是您在这里的唯一选项,您不能在代码注释中使用“适当的”注释来弃用包

@Deprecated
package my.old.pkg;
将导致Java 8中的编译错误

$ java -version
java version "1.8.0_191"

$ javac package-info.java
package-info.java:6: error: modifier deprecated not allowed here


这里唯一真正的、干净的选择是真正不推荐包中的所有类。仔细想想,这是有道理的,因为Java中的包只不过是一个名称空间

@Joachim很多东西都是多余的:IDE、版本控制、持续集成、构建系统等等。但是:没有它们,我不会开发。AspectJ具有这个特定的特性(以及许多其他特性),没有AspectJ是很难实现的。为什么不使用它呢?这当然没有坏处,而且有助于执行政策。对于否决这一点的人:为什么?这是一个有效的建议。你能给我展示一下其他的技术在那几行代码中也能做到这一点吗?@Sean:我想被否决的人会认为这是一个不好的建议。@Software Monkey:这是显而易见的。但我很感兴趣的是,为什么他们认为使用一种专门为此类任务设计的标准技术是一个不好的建议。@SoftwareMonkey我不同意。这是一个高素质专家免费提供建议的网站。对免费的建议说不谢谢是可以接受的,但是对那些花时间提供答案的人投反对票只有在答案很糟糕的情况下才是可以接受的。即使这样,你也应该给海报一个机会,通过陈述你不同意的内容来改进他的答案。你把这叫做抱怨?我不同意。我把你的所作所为称为恶作剧,我想你不同意。就这样吧。对我来说,对像这样的工作答案的评论要少一些,破坏这个网站。关于过度杀戮呢?我的建议归结为向maven pom添加<20行,并编写一个3行文本文件。将其与接受的答案进行比较,手动弃用包中的每个公共字段和方法。这太过分了!嗯,在我的例子中,有很多注释需要添加。我希望有一种方法可以让你只在包级别上做一次,IDE的工作方式就好像你在每个方法和字段上都做过一样。你可以只在包中的每个类上标记为@Deprecated。不需要向所有方法和字段添加注释。我在标准答案中添加了我的解决方案。“包只是一个名称空间”错误。包和名称空间是完全不同的东西,以不同的方式工作(例如,名称空间可以嵌套在其他名称空间中)。这不再是公认的答案。Java已经修复了它的bug,
@已弃用的
包现在可以完美地工作(Java9)。这个答案是错误的,如果它在Java 7中仍然被接受(这对@Andreas_D来说并不公平),我会在某个时候否决它,我相信这是正确的答案,因为现在可以使用@Deprecated作为包注释:我相信
@Deprecated
修饰符不允许出现在
javaDoc
@Milli中的
package info
级别中。请参阅关于Java 7中错误(已修复)的第一条注释。@muymoo,我使用的是Java8,它不允许我在我的
JavaDoc
中使用
@deprecated
修饰符。因此我之前的评论。从IntelliJ 2017.2开始,这不会将包内的类标记为已弃用,也不会将包本身标记为已弃用。请注意,弃用包内的所有内容与弃用包本身之间存在差异。如果删除
@deprecated
JavaDoc标记并仅保留
@deprecated
注释,则对包本身进行弃用表示当前包内的所有内容都已弃用,不应向该包添加任何内容,它编译正确。请阅读我的回答:这就是我写的:D但老实说:它有什么帮助