Java 8 爪哇8。将一个将类的状态更改为可运行的方法传递给该类的另一个方法是好的还是坏的做法

Java 8 爪哇8。将一个将类的状态更改为可运行的方法传递给该类的另一个方法是好的还是坏的做法,java-8,Java 8,刚刚注意到Java8的一个有趣特性。这实际上帮助我避免了很多重构,但我不确定这样做是否好。 亲爱的Stackoverflowers,你能告诉我这是否正确吗 这就是我所做的 例如,有一个我想要执行的服务,它应该有执行模式 import java.time.LocalDate; @Service public class SomeService { @Value("${com.example.url.mode.1}") private String runnerURLmode1; @Value

刚刚注意到Java8的一个有趣特性。这实际上帮助我避免了很多重构,但我不确定这样做是否好。 亲爱的Stackoverflowers,你能告诉我这是否正确吗

这就是我所做的

例如,有一个我想要执行的服务,它应该有执行模式

import java.time.LocalDate;

@Service
public class SomeService {

@Value("${com.example.url.mode.1}")
private String runnerURLmode1;

@Value("${com.example.url.mode.2}")
private String runnerURLmode2;

@Value("${example.url.mode.3}")
private String runnerURLmode3;

private String modeDependingField1;
private Integer modeDependingField2;
private LocalDate modeDependingField3;

public void setMode1() {
    modeDependingField1 = runnerURLmode1;
    modeDependingField2 = 1;
    modeDependingField3 = LocalDate.now();
}

public void setMode2() {
    modeDependingField1 = runnerURLmode2;
    modeDependingField2 = 2;
    modeDependingField3 = LocalDate.now().minusDays(2);
}

public void setMode3() {
    modeDependingField1 = runnerURLmode3;
    modeDependingField2 = 3;
    modeDependingField3 = LocalDate.now().minusDays(5);
}

public void execute(Runnable mode) {
    mode.run();

    System.out.println(toString());
}

@Override
public String toString() {
    return "modeDependingField1: " + modeDependingField1 + "\n" +
            "modeDependingField2: " + modeDependingField2 + "\n" +
            "modeDependingField3: " + modeDependingField3;
}
}
以及服务消费者

public class ServiceExecutor {

public static void main(String[] args) {
    SomeService someService = new SomeService();

    System.out.println("========= Executin mode 1 ===========");
    someService.execute(someService::setMode1);

    System.out.println("\n\n========= Executin mode 2 ===========");
    someService.execute(someService::setMode2);

    System.out.println("\n\n========= Executin mode 3 ===========");
    someService.execute(someService::setMode3);

}

}
所以我得到了输出:

==========执行模式1=========== modeDependingField1:1 modeDependingField2:1 modeDependingField3:2017-05-03

==========执行模式2=========== modeDependingField1:2 modeDependingField2:2 模式相关字段3:2017-05-01

=============执行模式3===================== modeDependingField1:3 modeDependingField2:3 modeDependingField3:2017-04-28


也许你需要一个枚举来描述
mode
,然后你可以将
setMode
s简化为一个
setMode
方法。我不明白这样做的好处。您仍在调用3个方法-但现在通过
Runnable
间接调用。@holi java,是的,实际上这与我声明enum@Eugene,第一个解决方案只是声明这些setter,并在execute方法之前从consumer调用它们,但如果将来要使用execute方法,则需要记住必须调用setMode。在这种情况下,您的
execute
方法实际上没有做任何事情,因此不清楚它为什么对它很重要,是否调用了
setMode
方法之一。事实上,它仍然无法确保提供的
Runnable
将调用其中一个方法。合乎逻辑的方法是让
执行
私有
,并让
setMode
方法在最后调用它;这样,在执行
之前肯定有一个
setMode
方法被执行。也许你需要一个枚举来描述
模式
,然后你可以将
setMode
减少到只有一个
setMode
方法。我不明白这样做的好处。您仍在调用3个方法-但现在通过
Runnable
间接调用。@holi java,是的,实际上这与我声明enum@Eugene,第一个解决方案只是声明这些setter,并在execute方法之前从consumer调用它们,但如果将来要使用execute方法,则需要记住必须调用setMode。在这种情况下,您的
execute
方法实际上没有做任何事情,因此不清楚它为什么对它很重要,是否调用了
setMode
方法之一。事实上,它仍然无法确保提供的
Runnable
将调用其中一个方法。合乎逻辑的方法是让
执行
私有
,并让
setMode
方法在最后调用它;这样,就可以确定在执行之前执行了一个
setMode
方法…