gpt4 book ai didi

java - 这是如何在 OOP 中重用代码?

转载 作者:行者123 更新时间:2023-11-30 09:04:26 24 4
gpt4 key购买 nike

我有一个类,它有一个生成随机数据来填充数组的方法。该类具有数据成员 private final Random rnd,它在构造函数中使用 new Random(); 初始化。用于数组生成数据的方法。

例如

package test;

import java.util.Random;

public class WorkWithArrays {

WorkWithArrays(Object[] arr) {
rand = new Random();
fillArrays(arr);
}

/*fills arrays with random data;
since this method is called from constructor
must be declared final*/
public final void fillArrays(Object[] arr) {
//code goes here
}

/*some other methods and data members*/

final private Random rand;
}

我正在编写一个新类,我还需要用随机值填充数组。有没有一种方法我不必重写相同的方法?我可以扩展 类或者我可以使方法静态化。因为我只需要 fillArrays() 使它成为 static 似乎是比 extending 更好的选择。

所以让我们把它设为静态。

public static final void fillArrays(Object[] arr) {
//code goes here
}

现在 fillArrays() 使用 rand 这是一个问题,因为 rand 不是静态的。那么为什么不让它静态化呢?现在在 WorkWithArrays 中,我们不再在构造函数中初始化 rand,而是将其作为数据成员 final static private Random rand = new Random(); .这是正确的吗?在构造函数之外初始化东西似乎是不好的做法。

现在我可以做

打包测试;

MyNewClass {
someMethod() {
int[] x = new int[25];
WorkWithArrays.fillArrays(x);
}
}

最佳答案

这不是坏习惯;正如沃伦指出的那样,有一个 static initializer用于此目的的构造。

例如,要创建一个具有类似实用程序的方法(“函数”,实际上不需要状态)的类,您可以做几件事。

使类本身成为final

这会阻止类的扩展,这是没有意义的。

public final class WorkWithArrays {
// ...
}

将构造函数设为私有(private)

这会阻止类被初始化

private WorkWithArrays() {}

创建一个静态随机化器

您可以自己创建/初始化它(这根本不是坏习惯!)

private static final Random rand = new Random();

或者使用前面提到的静态初始化器

private static Random rand;
static {
rand = new Random();
}

请注意,final 只能与静态属性一起使用如果它是在线初始化的

让你的随机数组填充方法静态化

就这么简单

public static void fillArrays(Object[] arr) {
// code goes here
}

这是实现称为 singleton 的设计模式的一种方法类,实际上在 OOP 语言中很常见。

在 Java 中,不是创建 getInstance() 类型的方法,实例通常存储在本地(或者根本不创建实例,例如这里的情况)并且静态方法引用到内部存储的实例。

初始化逻辑在 static { } 初始化 block 中,它在 Java classloader 时执行。首先加载类。

请注意,在您的示例中(在撰写本文时),您在静态方法上使用了 final 关键字。 This is not necessary ,并且经常被静态分析器捕获为无效/毫无意义。


我不是通常为 OP 编写代码的人,但以下是构建类1 的完美方法。

public final class WorkWithArrays {
private static final Random RAND; // = new Random();
static {
WorkWithArrays.RAND = new Random();
}

private WorkWithArrays() {}

public static void fillArrays(Object[] array) {
for (int i = 0, len = array.length; i < len; i++) {
array[i] = WorkWithArrays.RAND.nextInt();
}
}
}

1已省略导入

关于java - 这是如何在 OOP 中重用代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25213636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com