Forced Downcasting in Java

I want to force a downcast on an object that cannot be reset, and wondered what the correct approach would be. A use case is that I have a list of rules that are checked, and that will generate a list of failed rules. A failed rule is a subclass of the rule. But downgrade, like the FailedRule failedRule = (FailedRule) rule;

will fail because the rule object is not an instance of FailedRule

To get around this, I create a clone,
  FailedRule failedRule = new FailedRule (rule);

and my FailedRule class is as follows

public class FailedRule extends Rule{

/* 
 *force a down cast from Rule to FailedRule through cloning
*/
public FailedRule (Rule upcast){
   super.setRuleCode( upcast.getRuleCode());
   super.setType(upcast.getType());
   ..

Is there an easier way to do this? To answer my question, the design is flawed, the code should be:

public class FailedRule{
  private Rule rule;
  ..
  public setRule(Rule rule){
  ..
+3
6

, , , . (a Rule "", FailedRule). .

, ( FailedRule ) failed Rule.

+2

, FailedRule:

public static FailedRule asFailedRule(Rule rule){
    return (rule instanceof FailedRule)
    ? (FailedRule) rule
    : new FailedRule(rule)
}

( FailedRule, , FailedRule)

+2

. - , Rule.isFailed().

: , . , Rule.isFailed() . , , :

           Rule
         /      \
         |       \
    FailableRule  RuleC
     /     |   
 RuleA    RuleB

... - ? Gaawgh... .

+1

. .

, , :

private void copyFromRule(Rule otherRule) {
  this.setRuleCode(otherRule.getRuleCode());
  this.setType(otherRule.getType());
  ...
}

, , , clone(), .

- , super.setRuleCode this.setRuleCode. , , FailedRule setRuleCode.

0

. , . , .

0

, . , , - .

public class FailedRule extends Rule{

/* 
 *force a down cast from Rule to FailedRule through cloning
*/
public FailedRule (Rule upcast){
   super(upcast);
   //init FailedRule fields to defaults
}
}

public class Rule {

publiic Rule(Rule ruleToCopy) {
   //or even use the fields themselves. 
   this.setRuleCode( ruleToCopy.getRuleCode());
   this.setType(ruleToCopy.getType());
   ...
0

Source: https://habr.com/ru/post/1778342/


All Articles