是否可以阻止类在java中使用方法?

是否可以阻止类在java中使用方法?,java,methods,Java,Methods,假设我有一个名为Foo的类。这个类将被许多人修改,并将信息打印到控制台。为此,我们采用以下方法: private void print(String message){ ... } 以我们想要的格式打印到屏幕上 然而,在查看其他开发人员的代码时,我看到他们不断调用System.out.println(…) 相反,这会导致几乎无法读取的打印输出 我的问题是:是否有可能防止在Foo.java中使用System.out.println()?如果是,怎么做 我试着查找这个问题,但我发现的都与继承有关,

假设我有一个名为
Foo
的类。这个类将被许多人修改,并将信息打印到控制台。为此,我们采用以下方法:

private void print(String message){ ... }
以我们想要的格式打印到屏幕上

然而,在查看其他开发人员的代码时,我看到他们不断调用
System.out.println(…)

相反,这会导致几乎无法读取的打印输出

我的问题是:是否有可能防止在
Foo.java
中使用System.out.println()?如果是,怎么做

我试着查找这个问题,但我发现的都与继承有关,这与我的问题无关

非常感谢
N.S

编辑:我知道我必须做的任何阻止方法使用的事情都可以被开发人员删除,但是我们的政策是永远不要删除标记为
//IMPORTANT
的代码,所以它仍然可以作为一种威慑


EDIT2:我知道我可以简单地告诉开发人员不要这样做,或者使用代码审查来过滤掉“错误”,但是1)我已经在做了,而且花费了很多时间,2)问题是这是否可能,而不是如何处理我的开发人员。

public
方法就是这样-public的。没有办法限制对它们的访问


这类问题通常通过设置一些代码检查器(如PMD或checkstyle)并将它们集成到持续集成构建中来“解决”。因此,违反这些内容的行为将通过电子邮件发送给一位大腕:-)

您的修订控制系统(SVN、Git、Mercurial)的预提交挂钩可以
grep
用于
系统。{err,out}
并防止发生提交

是根据SVN的文件扩展名对不同更改的文件执行操作的示例。您应该能够修改该示例,以基于Java文件的某个子集的示例为例,并在如下情况下拒绝

egrep -q '\bSystem\.(err|out)\b'

尽管最好告知开发人员不应直接使用System.out,但您可以将System.out设置为另一个PrintStream,然后在私有方法中使用替代的PrintStream。这样,当人们使用System.out.println时,他们不会输出任何内容,但您仍然可以使用可选的PrintStream。。。类似于这里所做的事情:

不,不可能100%阻止类在Java中使用特定方法

话虽如此

我的建议是将代码分析添加到构建过程中,并在出现
System.out.println
时使构建失败。如果你对这条路线感兴趣的话,一个很好的开始就是退房


还有。。。与开发人员进行一些建设性的讨论,并讨论他们为什么要这样做。祝您好运。

您可以将
System.out
调用重定向到忽略输出或将其重定向到日志系统的流

System.setOut(printStream);

您还可以在生产环境中杀死那些使用
System.out.println
的人。

您可以用自己的实现替换
System
OutputStream
,该实现会引发异常,或者将调用重定向到自己的
print
实现(需要公开).

如何通过过程/通信而不是代码来实现这一点-例如,告诉开发人员“不要使用sysout?”告诉程序员如果他们这样做,你将削减他们的工资。使用类似于
log4j
的日志库,而不是直接打印到控制台。配置所记录的内容以及它们的用途。用越来越重的棍子击败开发人员,直到他们转换。解决这个问题的最好办法是使用一个工具来衡量编码标准的合规性。如果你不能阻止人们编辑代码和添加println语句,你将如何阻止他们编辑你最终使用的任何代码?还是仍然不使用打印语句,而是使用其他迂回的方式?听起来你有沟通问题,而不是代码问题。这就是我要做的。谢谢你的信息!(我会尽快接受这个答案,所以让我)是的,一些支票样式规则应该可以。毕竟,这就是静态分析工具的用途。