是否可以从静态 util 调用不同的实例
Is it possible to call diffrent instances from static util
更新:我用更多细节重写了我的问题。
Class 磁盘是第三方的,初始化时间很长,所以我想只创建一次作为静态成员。因为我无法更改它,所以我想用我自己的逻辑将其包装为实用程序 class.
假设我已经创建了实用程序:
class DiskUtilC {
static Disk disk = new Disk("c:\");
List static searchFile(String name) {
return soSomething(disk.search(name));
}
...many more static methods ...
}
class DiskUtilD {
static Disk disk = new Disk("d:\");
List static searchFile(String name) {
return soSomething(disk.search(name));
}
...many more static methods ...
}
由于两个 class 使用相同的静态方法,我想将它们全部移动到一个公共位置但保持相同的用法,即
DiskUtilC.searchFile("xxx");
DiskUtilD.searchFile("xxx");
无法将多态与静态一起使用我不确定是否可能。
我知道我总是可以做这样的事情 DiskUtil.getInstance("c").searchFile("xxx") 但它太麻烦了。有没有办法像我上面演示的那样做到这一点?
定义两个具有相同代码和不同静态字段的 classes DiskUtilC 和 DiskUtilD 没有任何好处 - 一个可能与另一个编辑不一致。
如果 C+D 驱动器的处理逻辑相同(即它们不需要不同的 soSomething
实现),您可以为 C 和 D 声明一个带有 2 个静态字段的 DiskUtil class驱动器和实例方法,例如 getName
/ searchFile
。示例:
class DiskUtil {
static final DiskUtil C = new DiskUtil("c:\");
static final DiskUtil D = new DiskUtil("d:\");
private final Disk disk;
private DiskUtil(String root) {
disk = new Disk(root)
}
void getName() {
return disk.name();
}
List searchFile(String name) {
return soSomething(disk.search(name));
}
...many more... (not-static methods)
}
然后通过DiskUtil使用:
DiskUtil.C.searchFile("xxx");
DiskUtil.D.searchFile("xxx");
但是使用 DiskUtil.getInstance("c")
或类似的方法可能更好,这样您就可以 getInstance
根据需要在首次使用时根据需要初始化任何驱动器,而不是仅使用硬接线 C/D。按需加载的示例还可以设置说 C()
以简化输入:
private static final ConcurrentHashMap<String,DiskUtil> DISKS = new ConcurrentHashMap<>();
private static DiskUtil getInstance(String drive) {
return DISKS.computeIfAbsent(drive.toLowerCase(), letter -> new DiskUtil(letter+":\"));
}
// Handy access to C:
static DiskUtil C() { return getInstance("C"); }
更新:我用更多细节重写了我的问题。
Class 磁盘是第三方的,初始化时间很长,所以我想只创建一次作为静态成员。因为我无法更改它,所以我想用我自己的逻辑将其包装为实用程序 class.
假设我已经创建了实用程序:
class DiskUtilC {
static Disk disk = new Disk("c:\");
List static searchFile(String name) {
return soSomething(disk.search(name));
}
...many more static methods ...
}
class DiskUtilD {
static Disk disk = new Disk("d:\");
List static searchFile(String name) {
return soSomething(disk.search(name));
}
...many more static methods ...
}
由于两个 class 使用相同的静态方法,我想将它们全部移动到一个公共位置但保持相同的用法,即
DiskUtilC.searchFile("xxx");
DiskUtilD.searchFile("xxx");
无法将多态与静态一起使用我不确定是否可能。
我知道我总是可以做这样的事情 DiskUtil.getInstance("c").searchFile("xxx") 但它太麻烦了。有没有办法像我上面演示的那样做到这一点?
定义两个具有相同代码和不同静态字段的 classes DiskUtilC 和 DiskUtilD 没有任何好处 - 一个可能与另一个编辑不一致。
如果 C+D 驱动器的处理逻辑相同(即它们不需要不同的 soSomething
实现),您可以为 C 和 D 声明一个带有 2 个静态字段的 DiskUtil class驱动器和实例方法,例如 getName
/ searchFile
。示例:
class DiskUtil {
static final DiskUtil C = new DiskUtil("c:\");
static final DiskUtil D = new DiskUtil("d:\");
private final Disk disk;
private DiskUtil(String root) {
disk = new Disk(root)
}
void getName() {
return disk.name();
}
List searchFile(String name) {
return soSomething(disk.search(name));
}
...many more... (not-static methods)
}
然后通过DiskUtil使用:
DiskUtil.C.searchFile("xxx");
DiskUtil.D.searchFile("xxx");
但是使用 DiskUtil.getInstance("c")
或类似的方法可能更好,这样您就可以 getInstance
根据需要在首次使用时根据需要初始化任何驱动器,而不是仅使用硬接线 C/D。按需加载的示例还可以设置说 C()
以简化输入:
private static final ConcurrentHashMap<String,DiskUtil> DISKS = new ConcurrentHashMap<>();
private static DiskUtil getInstance(String drive) {
return DISKS.computeIfAbsent(drive.toLowerCase(), letter -> new DiskUtil(letter+":\"));
}
// Handy access to C:
static DiskUtil C() { return getInstance("C"); }