| Just going through to see what's new/changed, and a couple small | |
| thoughts to do with as you will. I know this is a lot, but I hope it's | |
| useful feedback, whatever you do with it. | |
| >(*) Abstraction->Raw types | |
| >Shouldn't this be disabled unless under 1.5 (like @Deprecated), or at | |
| >least have that as an option? Probably a general thing about generics | |
| >-- some folks used the 1.4 version but others did not. I don't know | |
| >how to do it, but maybe a checkbox to disable/enable all generic checks | |
| >under 1.4? | |
| This is one that actually only turns itself on under 1.5 more or less automatically, | |
| since you'll only see this if you are coding against classes that have type arguments. | |
| If you're using the 1.5 libraries, you should probably be using them with parameters. | |
| >(*) Class Struct->Static inheritence | |
| >This is only avoidable easily with 1.5 imports of fields. Maybe this | |
| >also should have a "enable only if 1.5". | |
| Strongly disagree. Static inheritance can easily be avoided even with earlier JVMs, | |
| simply by qualifying all the references. Indeed, there's now a quickfix that does | |
| just that. This is a best practice, as static inheritance unnecessarily pollutes | |
| generated Javadoc, as well as being very iffy from an OO theory standpoint. | |
| >(*) Cloning->doesn't throw CNSE | |
| >I don't know who should ever turn this on. If you are making a class | |
| >cloneable, you often will not throw CNSE. | |
| You want clone() to throw CNSE so that subclasses which don't wish to support cloning | |
| can be written. Not a major use, but somewhat important for those writing libraries, | |
| and often forgotten. | |
| (*) General | |
| >Just a question: How do you decide whether a check is "General" or | |
| >"Code Style"? Just wondering. | |
| All of the "General" and "Local Analysis" inspections are built-in by JetBrains. | |
| I've asked them about making more descriptive names, but haven't got a response. | |
| >Maybe I should be clear -- I want to use one setting for errors and | |
| >switch between projects in 1.5 and 1.4. So I don't want to play around | |
| >with these settings. For example, I want to use annotations properly | |
| >in 1.5 code and not see them at all in code that I want to keep 1.4 | |
| >compatible. | |
| I have two separate but largely similar profiles for just that purpose. | |
| >Should be able to say "Same as <drop down list of other conventions>". | |
| Sadly, the current API prohibits that. I'll open a ticket. | |
| >(*) Performance issues | |
| >I just want to mark some disquiet here. | |
| I generally agree, but will note that there is one compelling counterargument. | |
| J2ME environments count cycles and class file bytes like a supermodel counts | |
| calories, and for good solid engineering and economic reasons. They generally | |
| lack JITs and state-of-the-art GC. I'm adding some (frankly odd) J2ME specific | |
| inspections in the next release, and will probably move some of the "Performance" | |
| issues to the new "J2ME" category. Certainly | |
| "Field repeatedly accessed in method" and "Anonymous inner class may be made | |
| named static inner class" will be moved to J2ME, as you | |
| are quite right that stuff like that simply doesn't matter to any rational | |
| J2SE or J2EE application. "Inner class may be static" will probably be kept | |
| where it is, although that's up in the air. | |
| >(*) Performance issues -> StringBuffer field | |
| >This is not a performance issue, is it? | |
| I'm probably also splitting out a "Memory management" category. StringBuffer fields | |
| are only a problem to the extent that they can grow larger than you expect, | |
| and are thus good places to search for memory leaks. | |
| >(*) Performance issues -> multiply/div by power of 2 | |
| >This is flat wrong. | |
| Yup, this one will either be killed or moved to the "J2ME" category. | |
| >(*) Performance issues -> static collection | |
| >Should have an option to ignore WeakHashMap or possibly some list of | |
| >types (as in "prohibited exception" checks) that are weak collection | |
| >types. | |
| Ooh, good call. | |
| >(*) Portability issues -> Hardcoded file sep | |
| >Maybe an exception for URL classes? Or strings that look like URLS? | |
| >In them, the slash dir is pre-defined. (This is the reason I leave | |
| >this off -- it flags too many URL contents.) | |
| It should be filtering this already, the logic for guessing URL's is quite involved. | |
| 'll look into it. | |
| >(*) Confusing Code -> COnfusing 'else' | |
| >The description could use a simple example to show what you mean. | |
| Yup. | |
| >(*) Probable bugs -> compareto vs. compareTo | |
| >This is a special case of a general problem -- a subclass that provides | |
| >a method whose name differs only in case from that of an inherited | |
| >method. | |
| Good ideas. | |
| >(*) Probably bugs -> floating point equality | |
| >Have an option to ignore checks for 0.0 and -0.0? And the constants in | |
| >Float and Double? It's reasonable to say "if (f == | |
| >Double.POSITIVE_INFINITY)", and 0.0 is a very well-defined value. | |
| Good idea. | |
| >A new check for comparsion to Double.NaN? That's always false: | |
| >Double.NaN != Double.NaN. | |
| May already be implemented as a "constant condition" by IDEA. If not, it's | |
| certainly a worthwhile candidate. | |
| >Compressible: the non-constant string exceptions. | |
| These were literally just added this weekend, and I'm going to let people play | |
| with them a bit before seeing how to modify them. Compression and a general list | |
| solution are definitely within possible future scope. | |
| >(*) Security -> serializable | |
| >When would I have a serializable class that wasn't deserializable? Is | |
| >this really two checks? (If so, maybe they're compressible?) | |
| Say you subclass a Serializable library class, and want it to include secure | |
| information (or generally just want to make your project hyper-secure). What | |
| you need to do then is explicitly make readObject() and writeObject() throw exceptions, | |
| to keep the bad guys from either writing your objects to a file or loading garbage | |
| objects into your application somehow. Yes, these are probably compressible. | |
| (*) Serialization -> Instance var ... | |
| Two things: (1) "Instance var" is a "field". Other places you use | |
| "field". Probably ought to be consistent overall. (I used -- nay, | |
| insisted upon -- "field" in my book because it's the thing people | |
| regularly say.); (2) You don't say whether you take | |
| >readObject and writeObject mismatched check? Same for | |
| >readResolve/writeReplace? | |
| Good ones. | |
| >Why is there a separate check for being without serialVersionUID for | |
| >class and non-static inner class? | |
| Because the second is much more dangerous, as many more changes can cause the | |
| default serialVersionUID to break. | |
| >Check for readobject vs. readObject (as in compareto vs. compareTo)? | |
| >And for the other methods, or any other signature mismatch (a | |
| >readObject(Foo) method)? | |
| Reasonable. | |
| >(*) Verbose -> Redundant no-arg | |
| >This is a problem -- if you don't declare the no-arg ctor, then you | |
| >can't javadoc it, and that's bad. At the least it should, by default, | |
| >not complain about such ctors that have javadoc. Removing them is not | |
| >harmless. | |
| Good eye. I'll add a "ignore redundant no-arg constructors if javadoced" flag. | |
| >(*) Verbose -> Redundant type cast | |
| >Isn't this already somewhere about "Overly strong type casts"? | |
| >Wouldn't that catch all the same things? | |
| "Redundant" is JetBrains. "Overly strong" is one of mine. If one were designing | |
| from a blank sheet of paper, you would merge these | |
| >(*) Verbose -> Unn 'continue' | |
| >As a way of showing that a loop is *meant* to be empty, a common style | |
| >is this: | |
| > while (...) | |
| > continue; | |
| >In this case I would want that warning suppressed. Probably need an | |
| >option. | |
| I've never seen such a style, but am not doubting you. Perhaps an option. | |
| >(*) Verbose -> Unn boxing | |
| >Is there any reason someone would want to set this a different way than | |
| >they set Unn unboxing? At least these seem compressible. | |
| Reasonable. |