纯Java方法应该是静态的吗?

时间:2019-09-05 14:34:11

标签: java

可以说我们有一个纯java方法。它是一种简单的验证方法。它会验证输入是否正确,否则会引发异常。

$url_list[] =

它是纯净的,它是静态的,它很小且易于推理。

因此,我一直在阅读有关Java静态方法的很多文章,很多人建议不要这样做。 主要是由于可测试性。 现在我完全明白了。模拟静态方法并不容易。如果我在其他某个单元中使用了该验证器,那么我必须接受它将成为测试的一部分(因为它是纯净的,所以可以),或者使用某种静态模拟框架。

但是为了使其成为可模拟且非静态的,我将不得不牺牲代码的简单性和可读性。我将不得不创建对象,并可能将其作为参数传递给使用它的单元。

因此,鉴于此,我宁愿将我的纯方法设为静态,而不是去嘲笑它们。看来让我的代码最简单,最干净。

您认为我正确吗?我在这里缺少什么吗?

3 个答案:

答案 0 :(得分:1)

我认为您只应该模拟公开的方法。我还要指出,您只应测试公开的方法。如果您的测试通过这种方式变得太大,则应考虑将实现分为更多的公共类,而不必使其成为非静态。

答案 1 :(得分:1)

没有副作用(方法是功能)的方法应该是静态的。都是 good 风格。 read_tsv("ftp://ftp.ncbi.nlm.nih.gov/genomes/ASSEMBLY_REPORTS/assembly_summary_refseq.txt", comment = "#", col_names = c( "assembly", "bioproject", "biosample", "wgs_master", "refseq_category", "taxid", "species_taxid", "organism_name", "infraspecific_name", "isolate", "version_status", "assembly_level", "release_type", "genome_rep", "seq_rel_date", "asm_name", "submitter", "gbrs_paired_asm", "paired_asm_comp", "ftp_path", "excluded_from_refseq", "relation_to_type_material" ) ) %>% select(assembly, refseq_category, assembly_level, genome_rep, version_status, release_type) %>% mutate( rpseudo = runif(nrow(.), 0, 1) ) -> df # it will got some warnings 提供了许多这样的功能。

对于测试,不会模拟这些功能,而是单独对其进行测试。

答案 2 :(得分:0)

static关键字在Java中存在是有原因的。对于“应该在Java中使用/避免使用静态”,没有黑色或白色的答案。它有其用例-Java是面向对象的,并且静态方法或变量更具功能性,因为它们与特定的对象无关。通常,纯函数与对象的特定实例无关。因此,使您的示例保持静态是有道理的。

为了可测试性而避免使用不是一个好主意。您想使您的代码更好,并尽可能适应需求。可测试性如下。是的,测试静态方法要稍微复杂一点,但这不应该成为您决策的起点。

我不同意“我宁愿将我的纯方法设为静态,而不是去嘲笑它们”-相反,纯函数对于测试非常重要,以确保其始终返回正确的值。

所以我的建议是使其静态化,并通过反射尽可能地对其进行测试。不要为测试牺牲代码。